我知道我可以否定[^bar]中的一组字符,但我需要一个正则表达式,其中否定适用于特定单词-所以在我的示例中,我如何否定一个实际的条,而不是“条中的任何字符”?
当前回答
解决方案:
^(?!.*STRING1|.*STRING2|.*STRING3).*$
xxxxxx正常
xxxSTRING1xxx KO(是否需要)
xxxSTRING2xxx KO(是否需要)
xxxSTRING3xxx KO(是否需要)
其他回答
您可以使用消极的前瞻性或滞后性:
^(?!.*?bar).*
^(.(?<!bar))*?$
或者只使用基础知识:
^(?:[^b]+|b(?:$|[^a]|a(?:$|[^r])))*$
这些都与不包含bar的任何内容相匹配。
我在尝试为以下英语语句确定正则表达式时遇到了这个论坛主题:
给定一个输入字符串,匹配所有内容,除非该输入字符串正好是“bar”;例如,我想匹配“barrier”和“disbar”以及“foo”。
这是我想出的正则表达式
^(bar.+|(?!bar).*)$
我对正则表达式的英文翻译是“匹配字符串,如果它以‘bar’开头,并且它至少有一个其他字符,或者如果字符串不以‘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).*$
负先行结构是一对括号,左括号后跟问号和感叹号。在lookahead内部[是任何正则表达式模式]。
接受的答案很好,但对于正则表达式中缺少简单的子表达式否定运算符来说,这确实是一个解决方案。这就是grep-invert匹配退出的原因。因此,在*nixes中,您可以使用管道和第二个正则表达式来实现所需的结果。
grep 'something I want' | grep --invert-match 'but not these ones'
仍然是一种变通方法,但可能更容易记住。
推荐文章
- 使用String.split()和多个分隔符
- 从数字中移除无关紧要的尾随零?
- 最终的邮政编码和邮政正则表达式是什么?
- 删除多个空白空间
- 正则表达式不是运算符
- 如何通过正则表达式过滤熊猫行
- 我如何在JavaScript中使用unicode感知的正则表达式?
- RE错误:在Mac OS X上的非法字节序列
- Regex验证日期格式dd/mm/YYYY, dd-mm-YYYY, dd.mm。YYYY, dd mmm, dd-mmm-YYYY, dd/mmm/YYYY, dd.mmm.YYYY与闰年支持
- jQuery验证:如何为正则表达式验证添加规则?
- 正则表达式在Javascript中获得括号之间的字符串
- 如何检查有效的电子邮件地址?
- Regex邮件验证
- 如何在bash脚本中使用正则表达式否定测试?
- 如何提取位于圆括号(圆括号)之间的文本?