正则表达式:(?!...)是什么意思?

Nic*_*ner 16 regex negative-lookahead

以下正则表达式在子串FTW和ODP之间找到文本.

/FTW(((?!FTW|ODP).)+)ODP+/
Run Code Online (Sandbox Code Playgroud)

什么是(?!...... )怎么办?

gna*_*arf 29

(?!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
/
Run Code Online (Sandbox Code Playgroud)

所以 - 寻找FTW,然后捕获,同时寻找ODP+结束我们的字符串.还要确保数据之间FTW和之间ODP+不包含FTWODP

  • +1用于正确解释它在提供的正则表达式中的使用方式。 (2认同)

mko*_*yak 19

来自perldoc:

一个零宽度负先行断言.例如,/foo(?!bar)/匹配任何未出现" foo"的" bar".但请注意,前瞻和后视不是一回事.你不能用它来做后卫.

如果你正在寻找一个没有" foo" 之前的"酒吧",那就/(?!foo)bar/不会做你想做的事.那是因为(?!foo)只是说下一件事不能是" foo" - 而事实并非如此,它是一个"酒吧",所以" foobar"会匹配.你必须做那样的事情/(?!foo)...bar/.我们说"喜欢",因为你的" bar"之前没有三个字符.你可以这样说:/(?:(?!foo)...|^.{0,2})bar/.有时候说它更容易:

if (/bar/ && $` !~ /foo$/)
Run Code Online (Sandbox Code Playgroud)


cle*_*tus 7

这意味着"没有跟着......".从技术上讲,这就是所谓的负向前瞻,因为你可以在没有捕获它的情况下窥视字符串中的前方.它是一类零宽度断言,意味着这样的表达式不捕获表达式的任何部分.