译文:正则表达式的真正实力
hsu.cy·47w
Preview
Report Post

,其他任何文本都不匹配。因此,表达式 (.*)\1 表示「一段文本后跟其自身的副本」。 这个简单的正则表达式匹配的文本称为「副本语言」(copy language),是另一种典型的上下文相关语言。

类似地,可以使用反向引用匹配上面举例过的其他文法:

# {a^n b^n, n>0} (上下文无关) 可表示为
/^ (?: a (?= a* (\1?+ b) ) )+ \1 $/x
# {a^n b^n c^n, n>0} (上下文相关) 可表示为
/^ (?: a (?= a* (\1?+ b) b* (\2?+ c) ) )+ \1 \2 $/x

这些正则表达式的原理超出了本文的范围,但可以看 StackOverflow 上一篇精彩的解释。

可见,仅仅添加反向引用(即使不支持 subpattern 递归)就已经大大充实了正则表达式的功能。实际上,加上这个功能意义重大,因为它使正则表达式的匹配成为一个「NP 完全」(NP-Complete)问题。

NP 完全是什么意思?这是从计算复杂性角度对决策问题的一种分类,许多「难题」都属于这一类。例如,旅行商问题(traveling salesman problem, TSP)、布尔可满足性问题(boolean satisfiability problem, SAT) 和背包问题(knapsack problem, BKP) 都属于 NP 完全问题。

(译注:上述三个问题的粗略描述如下——TSP 问,一个旅行商要访问 n 个城市,每个城市只访问一次,最后回到起点,如何找出总距离最短的路线?SAT 问,给定一个布尔表达式,是否存在一组变量的真值赋值,使得整个表达式为真?BKP 问,给定一组物品,每个物品有特定的重…

Similar Posts

Loading similar posts...