【发布时间】:2017-10-08 07:12:27
【问题描述】:
我使用的是 Ruby 2.4。我想在字符串中搜索一个单词,但前提是它之前没有另一个单词。我想我可以使用这种消极的前瞻,如下所示,但是如果“bad”这个词在“apple”之前,我不想完成匹配,我仍然会得到“bad apple”这个短语”。 “bad”这个词和“apple”这个词之间只有一个空格,这并不是给定的。
2.4.0 :014 > word_regex = /(?!.*bad)(^|\s)#{Regexp.escape(word)}(\s|$)/i
=> /(?!.*bad)(^|\s)apple(\s|$)/i
2.4.0 :015 > "good apple".match(word_regex)
=> #<MatchData " apple" 1:" " 2:"">
2.4.0 :016 > "bad apple".match(word_regex)
=> #<MatchData " apple" 1:" " 2:"">
我还缺少什么?
【问题讨论】:
-
我认为你想要一个消极的后视,例如
(?<!bad)。见SO docs -
bad和apple之间可以有任意数量的空格吗? Ruby 中的lookbehind 是固定宽度的,/(^|(?<!\bbad)\s)#{Regexp.escape(word)}(?!\S)/i可能无法在所有情况下正常工作。实际上,您使用空格作为单词边界这一事实暗示了您可以在此处不使用正则表达式。 -
你可能仍然使用前瞻,但表达式看起来会更难看:
(^\s*|\s(?!bad\s)\S+\s+)apple(?!\S)。
标签: ruby regex lookahead negative-lookahead