我知道我可以否定[^bar]中的一组字符,但我需要一个正则表达式,其中否定适用于特定单词-所以在我的示例中,我如何否定一个实际的条,而不是“条中的任何字符”?
当前回答
接受的答案很好,但对于正则表达式中缺少简单的子表达式否定运算符来说,这确实是一个解决方案。这就是grep-invert匹配退出的原因。因此,在*nixes中,您可以使用管道和第二个正则表达式来实现所需的结果。
grep 'something I want' | grep --invert-match 'but not these ones'
仍然是一种变通方法,但可能更容易记住。
其他回答
我只是想了些别的办法。它与我的第一个答案非常不同,因为它不使用正则表达式,所以我决定发布第二个答案。
在字符串上使用您选择的语言的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内部[是任何正则表达式模式]。
如果它真的是一个你不想匹配的词,那么:
^(?!.*\bbar\b).*$
以上内容将匹配任何不包含单词边界上的条的字符串,也就是说,与非单词字符分隔开。但是,除非使用正确的正则表达式标志,否则上述模式中使用的句点/点(.)将与换行符不匹配:
^(?s)(?!.*\bbar\b).*$
或者:
^(?!.*\bbar\b)[\s\S]*$
我们不使用任何特殊标志,而是寻找任何空白或非空白字符。这应该涵盖每个角色。
但如果我们想匹配可能包含bar但不包含特定单词bar的单词呢?
(?!\bbar\b)\b\[A-Za-z-]*bar[a-z-]*\b
(?!/bbar\b)断言下一个输入不是单词边界上的条。\b\[A-Za-z-]*bar[A-z-]*\b匹配包含bar的单词边界上的任何单词。
参见Regex演示
解决方案:
^(?!.*STRING1|.*STRING2|.*STRING3).*$
xxxxxx正常
xxxSTRING1xxx KO(是否需要)
xxxSTRING2xxx KO(是否需要)
xxxSTRING3xxx KO(是否需要)
我有一个文件名列表,我想通过这种行为(Ruby)排除某些文件名:
files = [
'mydir/states.rb', # don't match these
'countries.rb',
'mydir/states_bkp.rb', # match these
'mydir/city_states.rb'
]
excluded = ['states', 'countries']
# set my_rgx here
result = WankyAPI.filter(files, my_rgx) # I didn't write WankyAPI...
assert result == ['mydir/city_states.rb', 'mydir/states_bkp.rb']
以下是我的解决方案:
excluded_rgx = excluded.map{|e| e+'\.'}.join('|')
my_rgx = /(^|\/)((?!#{excluded_rgx})[^\.\/]*)\.rb$/
我对此应用程序的假设:
要排除的字符串位于输入的开头,或紧跟在斜线之后。允许的字符串以.rb结尾。允许的文件名没有。.rb之前的字符。
推荐文章
- Ruby正则表达式中\A \z和^ $的区别
- 用于匹配英国邮政编码的正则表达式
- 将所有非字母数字字符替换为空字符串
- 我如何能匹配一个字符串与正则表达式在Bash?
- 使用RegExp.exec从字符串中提取所有匹配项
- 仅用Regex替换某些组
- 使用正则表达式解析HTML:为什么不呢?
- 正则表达式来匹配不是空格的单个字符
- 在JavaScript中检查字符串包含另一个子字符串的最快方法?
- Python非贪婪正则表达式
- 正则表达式可以用来匹配嵌套模式吗?
- 在bash中使用正则表达式进行搜索和替换
- 将camelCaseText转换为标题大小写文本
- 正则表达式在Javascript中获取两个字符串之间的字符串
- Regex测试字符串是否以http://或https://开头