如何否定正则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
之前的字符