一个正则expression式来匹配没有被某个其他子string跟踪的子string
我需要一个匹配blahfooblah
但不blahfoobarblah
正则expression式
我希望它只匹配foo和foo周围的所有东西,只要不跟着吧。
我尝试使用这个: foo.*(?<!bar)
,它非常接近,但它匹配blahfoobarblah
。 负面的背后需要匹配任何东西,而不仅仅是酒吧。
我正在使用的特定语言是Clojure,它使用Java下的正则expression式。
编辑:更具体地说,我也需要它通过blahfooblahfoobarblah
但不blahfoobarblahblah
。
尝试:
/(?!.*bar)(?=.*foo)^(\w+)$/
testing:
blahfooblah # pass blahfooblahbarfail # fail somethingfoo # pass shouldbarfooshouldfail # fail barfoofail # fail
正则expression式解释
NODE EXPLANATION -------------------------------------------------------------------------------- (?! look ahead to see if there is not: -------------------------------------------------------------------------------- .* any character except \n (0 or more times (matching the most amount possible)) -------------------------------------------------------------------------------- bar 'bar' -------------------------------------------------------------------------------- ) end of look-ahead -------------------------------------------------------------------------------- (?= look ahead to see if there is: -------------------------------------------------------------------------------- .* any character except \n (0 or more times (matching the most amount possible)) -------------------------------------------------------------------------------- foo 'foo' -------------------------------------------------------------------------------- ) end of look-ahead -------------------------------------------------------------------------------- ^ the beginning of the string -------------------------------------------------------------------------------- ( group and capture to \1: -------------------------------------------------------------------------------- \w+ word characters (az, AZ, 0-9, _) (1 or more times (matching the most amount possible)) -------------------------------------------------------------------------------- ) end of \1 -------------------------------------------------------------------------------- $ before an optional \n, and the end of the string
其他正则expression式
如果你只想在foo
之后直接排除它,你可以使用
/(?!.*foobar)(?=.*foo)^(\w+)$/
编辑
你对你的问题进行了更新,使其具体。
/(?=.*foo(?!bar))^(\w+)$/
新的testing
fooshouldbarpass # pass butnotfoobarfail # fail fooshouldpassevenwithfoobar # pass nofuuhere # fail
新的解释
(?=.*foo(?!bar))
确保findfoo
,但不会直接跟在bar
为了匹配一个不以bar
开头的东西,请尝试
foo(?!bar)
你的负面后台的版本是有效的“匹配一个foo
然后是不以bar
结束的东西”。 .*
匹配所有barblah
,并且(?<!bar)
回头查看lah
并检查它是否与bar
不匹配,因此整个模式匹配。
改用负面观察:
\s*(?!\w*(bar)\w*)\w*(foo)\w*\s*
这对我有用,希望它有帮助。 祝你好运!
您的具体匹配请求可以匹配:
\w+foo(?!bar)\w+
这将匹配blahfooblahfoobarblah
但不blahfoobarblahblah
。
foo.*(?<!bar)
正则expression式的问题是foo.*(?<!bar)
之后的.*
。 它可以匹配包含任何字符在内的任何字符。
你写了一个评论,build议你喜欢这个工作匹配一个string中的所有单词而不是整个string本身。
而不是在评论中混合所有这些,我把它作为一个新的答案。
新的正则expression式
/(?=\w*foo(?!bar))(\w+)/
示例文本
foowithbar fooevenwithfoobar notfoobar foohere notfoobarhere butfooisokherebar notfoobarhere andnofuu needsfoo
火柴
foowithbar fooevenwithfoobar foohere butfooisokherebar needsfoo