如何否认正则表达式中的特定单词?

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


#1楼

您可使用否认的前瞻性或后瞻性性能

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

或仅使用基础知识: spa

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

这些都匹配不包含bar任何东西。 code


#2楼

除非性能是最重要的问题,不然一般只须要经过第二遍就能够轻松完成结果,而跳过那些与您要否认的单词相匹配的结果一般会更容易。 字符串

正则表达式一般意味着您不管如何都在执行脚本或某种低性能的任务,所以请找到易于阅读,易于理解和易于维护的解决方案。 get


#3楼

下面的正则表达式将知足您的要求(只要支持否认的lookbehinds和lookaheads),便可正确匹配事物; 惟一的问题是,它与单个字符匹配(即,每一个匹配都是单个字符,而不是两个连续的“小节”之间的全部字符),若是您使用的字符串很长,则可能会产生高开销。 it

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

#4楼

一个很好的方法是使用负前瞻io

^(?!.*bar).*$

否认的超前构造是一对圆括号,其中圆括号开头是问号和感叹号。 在先行内[是任何正则表达式模式]。 基础


#5楼

只是想到能够作的其余事情。 它与个人第一个答案有很大不一样,由于它不使用正则表达式,因此我决定发表第二个答案。 bug

在字符串上使用您所选择的语言的split()方法等效,并带有单词否认做为拆份内容的参数。 使用Python的示例:

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

至少在Python中这样作的好处是(至少我不记得该功能在Visual Basic或Java中是否相同),它能够在重复输入“ bar”时间接告诉您该字符串是因为结果列表中包含“ bar”之间的空字符串(尽管开头的空字符串是因为字符串的开头存在“ bar”的事实)。 若是您不但愿这样作,则只需从列表中删除空字符串便可。