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


当前回答

下面的正则表达式将执行您想要的操作(只要支持负lookbehinds和lookahead),并正确匹配;唯一的问题是它匹配单个字符(即,每个匹配都是单个字符,而不是两个连续的“条”之间的所有字符),如果使用非常长的字符串,则可能会导致高开销。

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

其他回答

我只是想了些别的办法。它与我的第一个答案非常不同,因为它不使用正则表达式,所以我决定发布第二个答案。

在字符串上使用您选择的语言的split()方法,该方法等效于将要否定的单词作为拆分对象的参数。使用Python的示例:

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

这样做的好处是,至少在Python中(我不记得在Visual Basic或Java中的功能是否相同),因为“bar”之间的空字符串包含在结果列表中(尽管开头的空字符串是因为字符串开头有一个“bar”),所以它可以间接地让您知道字符串中何时重复了“bar”。如果您不想这样做,只需从列表中删除空字符串即可。

除非性能是最重要的,否则通常只需通过第二次测试来运行结果,跳过那些与您想要否定的单词相匹配的单词就更容易了。

正则表达式通常意味着您正在执行脚本编写或某种低性能任务,因此请找到一个易于阅读、易于理解和易于维护的解决方案。

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

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

这是我想出的正则表达式

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

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

解决方案:

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

xxxxxx正常

xxxSTRING1xxx KO(是否需要)

xxxSTRING2xxx KO(是否需要)

xxxSTRING3xxx KO(是否需要)

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

^(?!.*bar).*$

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