1

文字列内のすべての関数呼び出しを見つけるための正規表現を作成しようとしています。例えば:

 No No       No       No         Yes       Yes        No DOT YES   NO    YES
 |  |        |        |           |         |         |   |   |     |      |
(1, 2, 3 * (1/4), 'somestr()', findme(), andme ( ), 'and' . me(), NTME, me(0) )

   No        No          No
   |         |           |
(CONST, 'some"q()', "nop\"no()")

文字列は常にパラメータ リスト eq => の形式になります。(a,b,c...)

その場合、その部分'and' . me()のみに一致する必要があることに注意してくださいme()

これまでのところ、これを使用して、引用符のすべてに一致する正規表現を作成できました

'/' . 
    '(?:\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\')' .      // single quoted string
        '|' .                                       //   or
    '(?:"[^"\\\\]*(?:\\\\.[^"\\\\]*)*")' .          // double quoted string
'/s';

私が必要とするのは、上記の正規表現にないものと一致する正規表現です。\w\s*\(

明確にするために、私はその上に「はい」があるものと一致させようとしています

そのような正規表現を書くにはどうすればよいですか?

4

1 に答える 1

2

トークナイザーに関する上記のコメントに同意しますが、正規表現を使用してこれを実現する方法は次のとおりです。

まず、phpはルックアラウンドを許可するため、前に'または"が付いていないものと一致\w\s*\(させることができます。

(?<!["'])\b\w+\s*\(

ここでインタラクティブな正規表現を参照してください)

「または(?<!["'])が前に付いていない」と言います。つまり、途中から始めるのではなく、関数名全体を一致させる必要があります。"'\b

これをphp構文に変換するには、バックスラッシュを2倍にすると思います(余分なバックスラッシュをエスケープすると、常に混乱します)。

'/(?<!["\'])\\b(\\w+)\\s*\\(/s'

\wまた、はであるため[0-9a-zA-Z_]、これはに一致することに注意してください2()。がないか、直前にあるため、引用符の内側にあるnoinとも一致します。"asdf no()"'"no

その場合、次のように、閉じ括弧のに引用符がないことを追加で指定できます。

(?<!["'])\b\w+\s*\([^)]+\)(?!'")

ここで、 「または(?!'")が続かない」と表示されます。'"

これにより、新しい一連の問題が発生します。たとえば、関数呼び出しにネストされた角かっこが含まれている(matchme('(asdf)')一致しない)場合などです。このような場合は、正規表現の調整と調整を続けることができますが、正規表現を壊すものが常にあり、最終的には、トークナイザーまたはパーサーを使用する方が簡単です。

于 2013-02-26T03:10:11.563 に答える