我知道可以使用[^bar]
来否定一组字符,但我需要一个正则表达式,其中否定适用于具体的单词 - 所以在我的例子中,如何否定一个真正的bar
,而不是“bar”中的任何字符?
我知道可以使用[^bar]
来否定一组字符,但我需要一个正则表达式,其中否定适用于具体的单词 - 所以在我的例子中,如何否定一个真正的bar
,而不是“bar”中的任何字符?
一个很好的方法是使用负向先行断言:
^(?!.*bar).*$
负向先行断言是一对括号,开头的括号后面跟着一个问号和一个感叹号。括号内部可以是任何正则表达式模式。grep -v bar
怎么样 :) - bobbelfoo
将匹配,bar
不会,但 foobar
或 barfoo
也不会! - bzim解决方案:
^(?!.*STRING1|.*STRING2|.*STRING3).*$
xxxxxx好的
xxxSTRING1xxx不行(是否需要)
xxxSTRING2xxx不行(是否需要)
xxxSTRING3xxx不行(是否需要)
你可以使用负向前瞻或后顾来实现:
^(?!.*?bar).*
^(.(?<!bar))*?$
或者只使用基础知识:
^(?:[^b]+|b(?:$|[^a]|a(?:$|[^r])))*$
这些都匹配不包含 bar
的任何内容。
b(?!ar)|(?<!b)a|a(?!r)|(?<!ba)r|[^bar]
foobar
上使用 /(?:(?!bar).)*/g
可以返回 foo
和 ar
。 - Krzysiek我阅读了这个论坛帖子,试图找到以下英文语句的正则表达式:
给定一个输入字符串,匹配所有内容,除非该输入字符串恰好为“bar”;例如,我想匹配“barrier”和“disbar”,以及“foo”。
这是我想出来的正则表达式
^(bar.+|(?!bar).*)$
我的翻译是:如果字符串以“bar”开头并且至少有一个其他字符,则匹配该字符串,或者如果字符串不以“bar”开头。
^(?!bar$).*
与此相同(除了完全匹配 bar
之外的所有内容),并避免了重复。 - bkDJ被接受的答案虽然很好,但实际上是在正则表达式中缺少简单的子表达式非运算符的情况下的一种解决方法。这就是为什么 grep --invert-match
存在的原因。所以在 *nixes 中,您可以使用管道和第二个正则表达式来实现所需的结果。
grep 'something I want' | grep --invert-match 'but not these ones'
依然是一种变通方法,但可能更容易记住。
bar
",那么请按照以下方式操作:^(?!.*\bbar\b).*$
^(?s)(?!.*\bbar\b).*$
或者:
^(?!.*\bbar\b)[\s\S]*$
我们不使用任何特殊标志,而是寻找任何空格或非空格字符。这应该覆盖了每一个字符。
但是,如果我们想匹配可能包含bar
的单词,但只是不包含特定单词bar
怎么办?
(?!\bbar\b)\b\[A-Za-z-]*bar[a-z-]*\b
(?!\bbar\b)
断言下一个输入不是单词边界上的bar
。\b\[A-Za-z-]*bar[a-z-]*\b
匹配包含bar
的任何单词,单词必须在单词边界上。[]
、()
和{}
引导的每个类,我发现这很容易记忆。Regex = {
'single_character': ['[]', '.', {'negate':'^'}],
'capturing_group' : ['()', '|', '\\', 'backreferences and named group'],
'repetition' : ['{}', '*', '+', '?', 'greedy v.s. lazy'],
'anchor' : ['^', '\b', '$'],
'non_printable' : ['\n', '\t', '\r', '\f', '\v'],
'shorthand' : ['\d', '\w', '\s'],
}