正则表达式:(?! ...) 是什么意思?
以下正则表达式查找子字符串 FTW 和 ODP 之间的文本。
/FTW(((?!FTW|ODP).)+)ODP+/
(?!
...)
的作用是什么?
The following regex finds text between substrings FTW and ODP.
/FTW(((?!FTW|ODP).)+)ODP+/
What does the (?!
...)
do?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
(?!regex)
是一个 零宽度负向预测 。它将测试当前光标位置和向前的字符,测试它们是否不匹配提供的正则表达式,然后将光标返回到它开始的位置。整个正则表达式:
所以 - 寻找
FTW
,然后在寻找ODP+
来结束我们的字符串时捕获。另请确保FTW
和ODP+
之间的数据不包含FTW
或ODP
(?!regex)
is a zero-width negative lookahead. It will test the characters at the current cursor position and forward, testing that they do NOT match the supplied regex, and then return the cursor back to where it started.The whole regexp:
So - Hunt for
FTW
, then capture while looking forODP+
to end our string. Also ensure that the data betweenFTW
andODP+
doesn't containFTW
orODP
来自 perldoc:
From perldoc:
意思是“后面没有……”。从技术上讲,这就是所谓的负向前瞻,因为您可以查看前面的内容字符串而不捕获它。它是一类零宽度断言,这意味着此类表达式不会捕获表达式的任何部分。
It means "not followed by...". Technically this is what's called a negative lookahead in that you can peek at what's ahead in the string without capturing it. It is a class of zero-width assertion, meaning that such expressions don't capture any part of the expression.
正则表达式
匹配第一个 FTW,紧接着既不是 FTW,也不是 ODP,然后是第一个 ODP 之前的所有后续字符(但如果其中某处有 FTW,则不会匹配),然后是后面的所有字母 P。
因此,在字符串中:
FTWFTWODPFTWjjFTWjjODPPPPjjODPPPjjj
它将匹配粗体部分
FTWFTWODPFTWjjFTWjjODPPPPjjODPPPjjj
Regex
matches first FTW immediately followed neither by FTW nor by ODP, then all following chars up to the first ODP (but if there is FTW somewhere in them there will be no match) then all the letters P that follow.
So in the string:
FTWFTWODPFTWjjFTWjjODPPPPjjODPPPjjj
it will match the bold part
FTWFTWODPFTWjjFTWjjODPPPPjjODPPPjjj
'?!'实际上是“(?! ... )”的一部分,这意味着里面的任何内容在该位置都不能匹配。
'?!' is actually part of '(?! ... )', it means whatever is inside must NOT match at that location.