为什么正则表达式不支持反向匹配?

Why doesn't regex support inverse matching?

下面链接的几个来源似乎表明正则表达式不是为反向匹配设计的 - 为什么不呢?

最近,在尝试整理有关 的问题的答案时,我遇到了几个问题,这让我对正则表达式的局限性感到好奇。

假设我们有一些字符串:a simple line of text. 我有一个正则表达式 [a-zA-Z]e 将匹配一个字母,后跟一个 e。这在 lenete 上匹配了 3 次。如果我想匹配所有 除了匹配正则表达式的模式怎么办? 假设我想捕获 a simpliofxt.,包括空格(换行符可选。)我后来了解到这种行为称为反向匹配,不久之后,它不是正则表达式容易支持的东西。

我检查了一些资源,但找不到任何关于为什么反向匹配不是 "good" 的具体答案。

所有这些似乎都表明正则表达式不是为反向模式匹配而设计的,但是 none 其中的原因很明显。为什么正则表达式的设计没有内置执行反向模式匹配的能力?

虽然正如您所指出的那样,直接正则表达式并不容易支持您想要的功能,但正则表达式 split 可以轻松支持这一点。考虑以下两个脚本,首先在 Java 中,然后在 Python 中:

String input = "a simple line of text.";
String[] parts = input.split("[a-z]e");
System.out.println(Arrays.toString(parts));

这会打印:

[a simp,  li,  of , xt.]

在Python中,我们可以尝试非常相似的东西:

inp = "a simple line of text."
parts = re.split(r'[a-z]e', inp)
print(parts)

这会打印:

['a simp', ' li', ' of ', 'xt.']

纯正则表达式中缺少的秘诀是解析迭代。一种好的编程语言,例如上面的语言,将公开一个 API,它可以使用提供的模式迭代输入字符串,并汇总拆分模式中的部分。