我可以否定使用前面的\ K组吗?我可以匹配bar
faxbar
funbar
和bobar
内的bar
,并省略foobar
fobar
foooooobar
内的栏}? https://regex101.com/r/qR9kD4/5
正则表达式
fo*\Kbar
字符串:( - 和期望的结果)
foobar - no match
fobar - no match
foooooobar - no match
faxbar - match 'bar'
funbar - match 'bar'
bobar - match 'bar'
bar - match 'bar'
dontmineidontwanttfooooobematchedaatall - no match
基本上反转我当前的比赛(dontmineme...
除外)。希望我只需要添加!
或其他东西!
答案 0 :(得分:2)
您可以将\K
与否定前瞻声明一起使用:
\b(?!fo+)\w*\Kbar
一个简单的解决方案是在交替的左侧放置您想要忽略的内容,并在交替运算符右侧的捕获组中放置您想要匹配的内容。
fo+bar|\w*(bar)
答案 1 :(得分:2)
如果你可以使用锚,它可能是可行的。它们使您能够确保在前瞻中查看的bar
与主正则表达式中消耗的bar
相同:
^(?!fo+bar$)[a-z]*\Kbar$
\b(?!fo+bar\b)[a-z]*\Kbar\b
如果您不能使用锚,则可能无法使用。我们需要更多地了解您期望看到的字符串类型,以及更详细的匹配标准。
但我不得不问,你真的必须使用\K
吗? Lookarounds似乎是一种显而易见的方法,但使用捕获组通常要容易得多。
\b(?!fo+bar\b)[a-z]*(bar)\b
您只需使用$~[1]
代替$&
来提取您感兴趣的子字符串。
答案 2 :(得分:1)
这应该这样做:
R = /^fo|bar/
str[R]=='bar'
虽然它没有使用\K
。
[
['foobar', false],
['fobar', false],
['foooooobar', false],
['faxbar', true ],
['funbar', true ],
['bobar', true ],
['bar', true ],
['dontmineidontwanttfooooobematchedaatall', false],
].each { |str,result| (str[R]=='bar') == result }
true
true
...
true
提供答案的其他人可能想要使用我的测试代码。