如何否定正则expression式中的特定单词?

我知道我可以在[^bar]否定字符组,但是我需要一个正则expression式,否定适用于特定的单词 – 所以在我的示例中,如何否定实际的"bar"而不是"any chars in bar"

一个很好的方法是使用负面的预测 :

 ^(?!.*bar).*$ 

除非性能是最重要的,否则通过第二遍运行结果通常会更容易,跳过那些与您想要否定的词相匹配的结果。

正则expression式通常意味着您正在执行脚本或某种低性能任务,因此find易于阅读,易于理解且易于维护的解决scheme。

下面的正则expression式将做你想做的事情(只要支持负向lookbeheads和lookaheads),正确地匹配事物; 唯一的问题是,它匹配单个字符(即每个匹配是一个单一的字符,而不是连续两个“酒吧”之间的所有字符),如果你使用很长的string,可能会导致高开销的潜力。

 b(?!ar)|(?<!b)a|a(?!r)|(?<!ba)r|[^bar] 

你可以使用负面预测或后视 :

 ^(?!.*?bar).* ^(.(?<!bar))*?$ 

或者只使用基础知识:

 ^(?:[^b]+|b(?:$|[^a]|a(?:$|[^r])))*$ 

这些都匹配任何不包含bar

我遇到这个论坛线程,同时试图找出以下英语语句的正则expression式:

给定一个inputstring,匹配所有东西, 除非这个inputstring正好是'bar'; 例如我想匹配'障碍'和'disbar'以及'foo'。

这是我提出的正则expression式

 ^(bar.+|(?!bar).*)$ 

我的正则expression式的英文翻译是“匹配string,如果它以'酒吧'开头,它至less有一个其他字符,或者如果string不是以'酒吧'开始。

解:

 ^(?!.*STRING1|.*STRING2|.*STRING3).*$ 

xxxxxx 好的

xxxSTRING1xxx KO(是否需要)

xxxSTRING2xxx KO(是否需要)

xxxSTRING3xxx KO(是否需要)

接受的答案是好的,但真正的解决方法是在正则expression式中缺less一个简单的子expression式否定运算符。 这就是grep --invert-match退出的原因。 所以在* nixes中,您可以使用pipe道和第二个正则expression式完成所需的结果。

 grep 'something I want' | grep --invert-match 'but not these ones' 

仍然是一个解决方法,但也许更容易记住。

只是想到可以做的其他事情。 这与我的第一个答案是非常不同的,因为它不使用正则expression式,所以我决定做第二个答案。

使用你select的语言split()方法等价的string作为否定的词作为参数分离。 一个使用Python的例子:

 >>> text = 'barbarasdbarbar 1234egb ar bar32 sdfbaraadf' >>> text.split('bar') ['', '', 'asd', '', ' 1234egb ar ', '32 sdf', 'aadf'] 

这样做的好处是,至less在Python中(我不记得在Visual Basic或Java中的function是否相同)是,它可以让你间接知道“bar”是否被重复由于“bar”之间的空string包含在结果列表中(尽pipe开始处的空string是由于string的开始处存在“bar”),所以该string。 如果你不想要,你可以简单地从列表中删除空的string。

我有一个文件名列表,我想排除某些行为(Ruby):

 files = [ 'mydir/states.rb', # don't match these 'countries.rb', 'mydir/states_bkp.rb', # match these 'mydir/city_states.rb' ] excluded = ['states', 'countries'] # set my_rgx here result = WankyAPI.filter(files, my_rgx) # I didn't write WankyAPI... assert result == ['mydir/city_states.rb', 'mydir/states_bkp.rb'] 

这是我的解决scheme:

 excluded_rgx = excluded.map{|e| e+'\.'}.join('|') my_rgx = /(^|\/)((?!#{excluded_rgx})[^\.\/]*)\.rb$/ 

我对这个应用程序的假设:

  • 要排除的string位于input的开始位置,或紧接在斜杠之后。
  • 允许的string以.rb结尾。
  • 允许的文件名没有. .rb之前的字符