17

次の正規表現は、部分文字列FTWとODPの間のテキストを検索します。

/FTW(((?!FTW|ODP).)+)ODP+/

(?!...は何をし)ますか?

4

6 に答える 6

30

(?!regex)ゼロ幅の負の先読みです。現在のカーソル位置と前方にある文字をテストし、指定された正規表現と一致しないことをテストしてから、カーソルを開始位置に戻します。

全体の正規表現:

/
 FTW           # Match Characters 'FTW'
 (             # Start Match Group 1
  (             # Start Match Group 2
   (?!FTW|ODP)   # Ensure next characters are NOT 'FTW' or 'ODP', without matching
   .             # Match one character
  )+            # End Match Group 2, Match One or More times
 )             # End Match Group 1
 OD            # Match characters 'OD'
 P+            # Match 'P' One or More times
/

そのため、 を探してから、文字列を終了するFTWために を探しながらキャプチャします。ODP+また、 と の間のデータにまたはが含まれFTWODP+いないことを確認してください。FTWODP

于 2009-09-03T02:45:05.723 に答える
19

perldocから:

ゼロ幅の負の先読みアサーション。たとえば、「 」が後に続かない/foo(?!bar)/「」の出現に一致します。ただし、先読みと後読みは同じものではないことに注意してください。これを後読みに使用することはできません。foobar

foo「 」が前に付いていない「バー」を探している場合、あなたが望むことをし/(?!foo)bar/ません。これ(?!foo)は、次のことは「foo」ではありえないと言っているだけだからです。そうではなく、「バー」なので、「foobar」は一致します。あなたはそのためにそのようなことをしなければならないでしょう/(?!foo)...bar/。「いいね」と言うのは、「bar」の前に3文字がない場合があるからです。あなたはこの方法でそれをカバーすることができます:/(?:(?!foo)...|^.{0,2})bar/。次のように言う方が簡単な場合もあります。

if (/bar/ && $` !~ /foo$/)
于 2009-09-03T02:31:13.080 に答える
7

「その後に...が続かない」という意味です。技術的には、これはネガティブルックアヘッドと呼ばれるもので、文字列をキャプチャせずに文字列の前方を覗くことができます。これはゼロ幅アサーションのクラスです。つまり、このような式は式のどの部分もキャプチャしません。

于 2009-09-03T02:30:27.480 に答える
2

正規表現

/FTW(((?!FTW|ODP).)+)ODP+/

最初の FTW に一致し、その直後に FTW も ODP も続きません。次に、最初の ODP までの後続のすべての文字 (ただし、それらのどこかに FTW がある場合は一致しません)、その後に続くすべての文字 P に一致します。

したがって、文字列で:

FTWFTWODPFTWjjFTWjjODPPPPjjODPPPjjj

太字部分に一致します

FTWFTWODPFTWjj FTWjjODPPPPjjODPPPjjj _

于 2009-09-03T03:02:31.937 に答える
2

プログラマーのタイピングが速すぎたに違いありません。パターンの一部の文字が反転しました。訂正:

/WTF(((?!WTF|ODP).)+)ODP+/
于 2009-09-03T02:45:52.103 に答える
0

「?!」は実際には'(?!...)'の一部であり、内部にあるものはその場所で一致してはならないことを意味します。

于 2009-09-03T02:31:52.250 に答える