2

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
4

3 回答 3

9

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

于 2010-05-23T06:47:14.760 回答
2

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

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

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

正则表达式是:

  • (?<=(.))- 向后看并将角色捕捉到\1
  • (?!\1)- 前瞻和否定匹配\1

相关问题

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

于 2010-05-23T16:23:42.987 回答
0

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

谢天谢地,我能够在 Google(实际上,我不确定 Google 是否已经存在……)中找到了一个 regexp-negation regexp。但这确实花了我一些时间,如果当时存在 StackOverflow,那会容易得多

于 2010-05-23T08:21:12.240 回答