1

これはstackoverflowに関する私の最初の投稿ですので、私に優しくしてください...

私はまだ正規表現を学んでいます-主に、それらがどれほど有用であるかをついに発見したためです。これは、Sublime Text 2を使用することによって部分的に行われます。つまり、これはPerl正規表現です(私は信じています)

私はこのサイトや他のサイトで検索を行いましたが、今は本当に行き詰まっています。多分私はできないことをやろうとしています

特定の変数またはメソッド呼び出しを含む関数、メソッド、またはプロシージャなどを検索できる正規表現(パターン)を見つけたいと思います。

私はいくつかの表現を試しましたが、それらは途中まで進んでいるように見えますが、完全ではありません。特にJavascriptで検索する場合、探している呼び出し/変数に最も近いものではなく、複数の関数宣言を取得します。

例:私が学んだsave data()メソッドを呼び出す関数を探しています。この優れたサイトから、(?s)を使用して切り替えることができます。改行を含める

function.*(?=(?s).*?savedata\(\))

ただし、これにより、word関数の最初のインスタンスが検索され、次に、savedata()を含むすべてのテキストが検索されます。

複数のプロシージャがある場合は、次の関数から開始し、savedata()に再度到達するまで繰り返します

function(?s).*?savedata\(\) does something similar

次のようなものを使用して、2番目の関数(私は信じています)を無視するように依頼しようとしました。

function(?s).*?(?:(?!function).*?)*savedata\(\)

しかし、それはうまくいきません。

私は前向きと後ろ向きでいくつかの調査を行いましたが、私はそれを間違って行っているか(非常に可能性が高い)、またはそれらは正しいことではありません。

要約すると(私は推測します)、特定の単語から別の単語の最も近い出現箇所に戻るにはどうすればよいですか?

現時点では、これを使用していくつかのjavascriptファイルを検索し、構造/呼び出しなどを理解しようとしていますが、最終的にはc#ファイルといくつかのvb.netファイルで使用したいと考えています。

よろしくお願いします

迅速な対応に感謝し、コードのサンプルブロックを追加しなかったことをお詫びします-これを今すぐ実行します(変更されましたが、問題を表示するにはまだ十分です)

次のようなJavaScriptの単純なブロックがある場合:

    function a_CellClickHandler(gridName, cellId, button){
        var stuffhappenshere;
        var and here;
        if(something or other){
            if (anothertest) {

                event.returnValue=false;
                event.cancelBubble=true;
                return true; 
            }
            else{
                event.returnValue=false;
                event.cancelBubble=true;
                return true;
            }
        } 
    }

    function a_DblClickHandler(gridName, cellId){
        var userRow = rowfromsomewhere;
        var userCell = cellfromsomewhereelse;
        //this will need to save the local data before allowing any inserts to ensure that they are inserted in the correct place
        if (checkforarangeofthings){
            if (differenttest) {
                InsSeqNum = insertnumbervalue;
                InsRowID = arow.getValue()
                blnWasInsert = true;
                blnWasDoubleClick = true;
                SaveData();      
            }
        }
    }

これに対して正規表現を実行します-動作しているはずであると識別された2番目の正規表現を含めてSublimeText2は、最初の関数からSaveData()までのすべてを選択します

この場合、両方ではなく、dblClickHandlerだけにアクセスできるようにしたいと思います。

うまくいけば、このコードスニペットが明確になり、標準のコードファイルで十分だと思っていたので、最初に投稿しなかったことをお詫びします。

4

1 に答える 1

0

この正規表現は、SaveDataメソッドを含むすべてのJavascript関数を検索します。

(?<=[\r\n])([\t ]*+)function[^\r\n]*+[\r\n]++(?:(?!\1\})[^\r\n]*+[\r\n]++)*?[^\r\n]*?\bSaveData\(\)

これは、SaveDataメソッドを含む最初の行までの関数のすべての行と一致します。

警告:

  • 正規表現は一致するインデントを使用して関数の終了を検出するため、これが機能するには、ソースコードに整形式のインデントが必要です。
  • ファイルの最初の行から始まる場合、関数と一致しません。

説明:

(?<=[\r\n])                      Start at the beginning of a line
([\t ]*+)                        Capture the indentation of that line in Capture Group 1
function[^\r\n]*+[\r\n]++        Match the rest of the declaration line of the function
(?:(?!\1\})[^\r\n]*+[\r\n]++)*?  Match more lines (lazily) which are not the last line of the function, until: 
[^\r\n]*?\bSaveData\(\)          Match the first line of the function containing the SaveData method call

注:*+およびは所有格の++数量詞であり、実行を高速化するためにのみ使用されます。

編集: 正規表現に関する2つの小さな問題を修正しました。
編集: 正規表現に関する別の小さな問題を修正しました。

于 2013-01-27T01:15:52.240 に答える