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

时间:2019-08-23 04:37:01

标签: regex regex-lookarounds

下面链接的一些资源似乎表明正则表达式不是为逆向匹配而设计的-为什么不呢?

最近,在尝试解答有关a regex to match everything that was left after a specific pattern的问题时,我遇到了几个使我对正则表达式的局限性感到好奇的问题。

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

我已经检查了一些资源,但是找不到为什么逆匹配不是“好”的具体答案。

所有这些似乎都表明正则表达式不是为逆模式匹配而设计的,但是对于其背后的原因,它们都不是立即显而易见的。为何正则表达式没有设计为具有执行逆模式匹配的内置功能?

1 个答案:

答案 0 :(得分:2)

正如您所指出的,虽然直接正则表达式不能轻松地支持所需的功能,但是正则表达式 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.']

纯正则表达式中缺少的秘密调味料是 parsing iteration 。像上面这样的一种好的编程语言,将公开一个API,该API可以使用提供的模式来迭代输入字符串,并从拆分模式中汇总各个部分。