我知道我可以否定[^bar]中的一组字符,但我需要一个正则表达式,其中否定适用于特定单词-所以在我的示例中,我如何否定一个实际的条,而不是“条中的任何字符”?
当前回答
如果它真的是一个你不想匹配的词,那么:
^(?!.*\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演示
其他回答
我有一个文件名列表,我想通过这种行为(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之前的字符。
如果它真的是一个你不想匹配的词,那么:
^(?!.*\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演示
下面的正则表达式将执行您想要的操作(只要支持负lookbehinds和lookahead),并正确匹配;唯一的问题是它匹配单个字符(即,每个匹配都是单个字符,而不是两个连续的“条”之间的所有字符),如果使用非常长的字符串,则可能会导致高开销。
b(?!ar)|(?<!b)a|a(?!r)|(?<!ba)r|[^bar]
除非性能是最重要的,否则通常只需通过第二次测试来运行结果,跳过那些与您想要否定的单词相匹配的单词就更容易了。
正则表达式通常意味着您正在执行脚本编写或某种低性能任务,因此请找到一个易于阅读、易于理解和易于维护的解决方案。
我在尝试为以下英语语句确定正则表达式时遇到了这个论坛主题:
给定一个输入字符串,匹配所有内容,除非该输入字符串正好是“bar”;例如,我想匹配“barrier”和“disbar”以及“foo”。
这是我想出的正则表达式
^(bar.+|(?!bar).*)$
我对正则表达式的英文翻译是“匹配字符串,如果它以‘bar’开头,并且它至少有一个其他字符,或者如果字符串不以‘bar‘开头。
推荐文章
- 如何从JavaScript中使用正则表达式的字符串中剥离所有标点符号?
- 正则表达式中的单词边界是什么?
- 如何将一个标题转换为jQuery的URL段塞?
- Javascript和regex:分割字符串并保留分隔符
- (grep)正则表达式匹配非ascii字符?
- 如何在保持原始字符串的同时对字符串执行Perl替换?
- 创建正则表达式匹配数组
- *的区别是什么?和。*正则表达式?
- 如何将“camelCase”转换为“Camel Case”?
- 在Java中使用正则表达式提取值
- Java中的正则表达式命名组
- 使用正则表达式搜索和替换Visual Studio代码
- 使用split("|")按管道符号拆分Java字符串
- 替换字符串中第一次出现的模式
- “\d”在正则表达式中是数字吗?