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

大城市里の小女人 提交于 2020-01-06 15:24:32

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

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


#1楼

您可以使用否定的前瞻性或后瞻性

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

或仅使用基础知识:

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

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


#2楼

除非性能是最重要的问题,否则通常只需要通过第二遍就可以轻松完成结果,而跳过那些与您要否定的单词相匹配的结果通常会更容易。

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


#3楼

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

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

#4楼

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

^(?!.*bar).*$

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


#5楼

只是想到可以做的其他事情。 它与我的第一个答案有很大不同,因为它不使用正则表达式,所以我决定发表第二个答案。

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

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

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!