下面的正则表达式查找FTW子和ODP之间的文本。
/FTW(((?!FTW|ODP).)+)ODP+/
什么是(?!
... )
怎么办?
下面的正则表达式查找FTW子和ODP之间的文本。
/FTW(((?!FTW|ODP).)+)ODP+/
什么是(?!
... )
怎么办?
(?!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+
到结束,我们字符串。 此外,还要确保之间的数据FTW
和ODP+
不包含FTW
或ODP
从的perldoc :
零宽度负先行断言 。 例如
/foo(?!bar)/
匹配“出现的任何foo
”,也就是后面没有“bar
”。 但是请注意,前瞻和查找背后是不一样的事情。 您不能向后看使用。如果你正在寻找一个不是由“前面有一个“棒”
foo
”,/(?!foo)bar/
不会做你想要的。 这是因为(?!foo)
只是说,接下来的事情不能“foo
‘ -并且它不是,它是一个‘棒’,因此’foobar
”将匹配。 你将不得不做一些像/(?!foo)...bar/
了点。 我们说“喜欢”,因为有你“的情况bar
”没有前三个字符。 你可以涵盖这样:/(?:(?!foo)...|^.{0,2})bar/
。 有时,它仍然容易只是说:
if (/bar/ && $` !~ /foo$/)
它的意思是“不跟...”。 从技术上讲这是什么叫做负前瞻中,你可以在什么字符串中的领先偷看而不捕获它。 它是一个类零宽度断言的,这意味着,这样的表达式不捕获表达的任何部分。
程序员必须已经打字太快。 在模式中的某些字符得到了翻转。 更正:
/WTF(((?!WTF|ODP).)+)ODP+/
正则表达式
/FTW(((?!FTW|ODP).)+)ODP+/
比赛第一FTW立即既不FTW也不是由ODP紧随其后,那么所有的字符之后直到第一ODP(但如果FTW某处他们会有不匹配),那么随后所有的字母P上。
所以在字符串:
FTWFTWODPFTWjjFTWjjODPPPPjjODPPPjjj
它将匹配的加粗部分
FTWFTWODPFTWjj FTWjjODPPPP jjODPPPjjj
'?!' 实际上是部分“(?!...)”,这意味着无论是内一定不能在该位置匹配。