使用前面的\ K组负面

时间:2015-07-31 02:11:17

标签: ruby regex

我可以否定使用前面的\ K组吗?我可以匹配bar faxbar funbarbobar内的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...除外)。希望我只需要添加!或其他东西!

3 个答案:

答案 0 :(得分:2)

您可以将\K与否定前瞻声明一起使用:

\b(?!fo+)\w*\Kbar

Demo

一个简单的解决方案是在交替的左侧放置您想要忽略的内容,并在交替运算符右侧的捕获组中放置您想要匹配的内容。

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

提供答案的其他人可能想要使用我的测试代码。