我知道我可以否定[^bar]中的一组字符,但我需要一个正则表达式,其中否定适用于特定单词-所以在我的示例中,我如何否定一个实际的条,而不是“条中的任何字符”?


当前回答

解决方案:

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

xxxxxx正常

xxxSTRING1xxx KO(是否需要)

xxxSTRING2xxx KO(是否需要)

xxxSTRING3xxx KO(是否需要)

其他回答

接受的答案很好,但对于正则表达式中缺少简单的子表达式否定运算符来说,这确实是一个解决方案。这就是grep-invert匹配退出的原因。因此,在*nixes中,您可以使用管道和第二个正则表达式来实现所需的结果。

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

仍然是一种变通方法,但可能更容易记住。

我有一个文件名列表,我想通过这种行为(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']

以下是我的解决方案:

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

我对此应用程序的假设:

要排除的字符串位于输入的开头,或紧跟在斜线之后。允许的字符串以.rb结尾。允许的文件名没有。.rb之前的字符。

要做到这一点,一个很好的方法是使用负面展望:

^(?!.*bar).*$

负先行结构是一对括号,左括号后跟问号和感叹号。在lookahead内部[是任何正则表达式模式]。

您可以使用消极的前瞻性或滞后性:

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

或者只使用基础知识:

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

这些都与不包含bar的任何内容相匹配。

我在尝试为以下英语语句确定正则表达式时遇到了这个论坛主题:

给定一个输入字符串,匹配所有内容,除非该输入字符串正好是“bar”;例如,我想匹配“barrier”和“disbar”以及“foo”。

这是我想出的正则表达式

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

我对正则表达式的英文翻译是“匹配字符串,如果它以‘bar’开头,并且它至少有一个其他字符,或者如果字符串不以‘bar‘开头。