正则表达式:什么(?!...)是什么意思?(Regex: what does (?! …) mean

2019-08-03 13:27发布

下面的正则表达式查找FTW子和ODP之间的文本。

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

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

Answer 1:

(?!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



Answer 2:

从的perldoc :

零宽度负先行断言 。 例如/foo(?!bar)/匹配“出现的任何foo ”,也就是后面没有“ bar ”。 但是请注意,前瞻和查找背后是不一样的事情。 您不能向后看使用。

如果你正在寻找一个不是由“前面有一个“棒” foo ”, /(?!foo)bar/不会做你想要的。 这是因为(?!foo)只是说,接下来的事情不能“ foo ‘ -并且它不是,它是一个‘棒’,因此’ foobar ”将匹配。 你将不得不做一些像/(?!foo)...bar/了点。 我们说“喜欢”,因为有你“的情况bar ”没有前三个字符。 你可以涵盖这样: /(?:(?!foo)...|^.{0,2})bar/ 。 有时,它仍然容易只是说:

if (/bar/ && $` !~ /foo$/)


Answer 3:

它的意思是“不跟...”。 从技术上讲这是什么叫做负前瞻中,你可以在什么字符串中的领先偷看而不捕获它。 它是一个类零宽度断言的,这意味着,这样的表达式不捕获表达的任何部分。



Answer 4:

程序员必须已经打字太快。 在模式中的某些字符得到了翻转。 更正:

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


Answer 5:

正则表达式

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

比赛第一FTW立即既不FTW也不是由ODP紧随其后,那么所有的字符之后直到第一ODP(但如果FTW某处他们会有不匹配),那么随后所有的字母P上。

所以在字符串:

FTWFTWODPFTWjjFTWjjODPPPPjjODPPPjjj

它将匹配的加粗部分

FTWFTWODPFTWjj FTWjjODPPPP jjODPPPjjj



Answer 6:

'?!' 实际上是部分“(?!...)”,这意味着无论是内一定不能在该位置匹配。



文章来源: Regex: what does (?! …) mean?