为什么需要否定正则表达式?

时间:2010-05-23 06:43:41

标签: regex regex-negation

关于regex-negation,关于SO有很多问题。

我不确定我理解为什么人们觉得需要否定正则表达式。 为什么不使用仅显示与正则表达式不匹配的结果的grep -v


$ ls
april  august  december  february  january  july  june  march  may  november  october  september
$ ls | grep ber
december
november
october
september
$ ls | grep -v ber
april
august
february
january
july
june
march
may

3 个答案:

答案 0 :(得分:9)

可能是因为grep不是唯一使用正则表达式的地方?它适用于这个简单的场景......实际上在许多其他地方,你可以说“匹配这个正则表达式”......但是......好吧,如果你只需要否定它怎么办?正则表达式的一部分? “匹配这个,但不符合这个”你会怎么做?你不能只是否定整件事。

答案 1 :(得分:2)

你是对的,没有必要否定整个正则表达式,但你肯定看到在更大的模式中否定子模式的价值?

这是一个简单的例子:将字符串拆分为运行。在Java中,这只是split上的(?<=(.))(?!\1)

System.out.println(java.util.Arrays.toString(
    "aaaabbbccdeeefg".split("(?<=(.))(?!\\1)")
)); // prints "[aaaa, bbb, cc, d, eee, f, g]"

正则表达式是:

  • (?<=(.)) - 向后看并将角色捕捉到\1
  • (?!\1) - 预测并否定\1
  • 上的匹配

相关问题

所有这些问题都使用否定断言:

答案 2 :(得分:0)

我记得需要它的一个实例是Apache配置。在Apache中,如果当前请求与某个PCRE正则表达式匹配,有一种方法可以重定向到不同的URI,但是当我需要它时(或者至少是,当我需要它时),如果当前请求没有,则无法重定向匹配正则表达式。

值得庆幸的是,我能够使用谷歌(实际上,我不确定谷歌已经存在......)来获得正则表达式否定正则表达式。但它肯定花了我一些时间,如果当时存在StackOverflow,它将会更容易