最佳答案
这是一系列教育性正则表达式文章的第二部分。它展示了如何使用查找头和嵌套引用来匹配非正则语言 aNbN。嵌套引用首先在 这个正则表达式如何找到三角形数字?中引入
非 普通语言的典型例子之一是:
L = { a
Nb
N: n > 0 }
这是所有非空字符串的语言,这些字符串由一定数量的 a
和一定数量的 b
组成。这种语言中的字符串示例有 ab
、 aabb
、 aaabbb
。
这种语言可以通过 泵引理显示为非正则语言。它实际上是一个原型 上下文无关语言,它可以由 上下文无关文法 S → aSb | ab
生成。
尽管如此,现代的正则表达式实现显然识别的不仅仅是普通语言。也就是说,按照形式语言理论的定义,它们不是“规则的”。PCRE 和 Perl 支持递归正则表达式,并且。NET 支持平衡组定义。即使不那么“花哨”的特性,例如反向引用匹配,也意味着正则表达式不是正则的。
但是这些“基本”功能到底有多强大呢?例如,我们可以用 Javaregex 识别 L
吗?我们是否可以将查找和嵌套引用结合起来,使用一种模式来匹配诸如 ab
、 aabb
、 aaabbb
等字符串?
java.util.regex.Pattern