,其他任何文本都不匹配。因此,表达式 (.*)\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...

Keyboard Shortcuts

Navigation
Next / previous item
j/k
Open post
oorEnter
Preview post
v
Post Actions
Love post
a
Like post
l
Dislike post
d
Undo reaction
u
Recommendations
Add interest / feed
Enter
Not interested
x
Go to
Home
gh
Interests
gi
Feeds
gf
Likes
gl
History
gy
Changelog
gc
Settings
gs
Browse
gb
Search
/
General
Show this help
?
Submit feedback
!
Close modal / unfocus
Esc

Press ? anytime to show this help