3

为了澄清,我想匹配:

ab
aabb
aaabbb
...

这在 Perl 中有效:

if ($exp =~ /^(a(?1)?b)$/)

要理解这一点,请查看字符串,就好像它是从外向内生长的,而不是从左向右生长的:

ab
a(ab)b
aa(ab)bb

(?1)是对外部括号集的引用。?对于最后一种情况(从外到内),我们需要after,什么都没有,并且?表示前面表达式的 0 或 1(所以它本质上是我们的基本情况)。

我发布了一个类似的问题,询问(?1)Java 中的等价物是什么?今天才知道\\1是指第一个捕获组。所以,我认为这会起作用:

String pattern = "^(a(?:\\1)?b)$";

但它没有。有谁知道为什么?

注意:我知道还有其他更好的方法可以做到这一点。这严格来说是一个教育问题。正如我想知道为什么这种特殊方式不起作用以及是否有办法解决它。

4

1 回答 1

1

\\1是一个反向引用,它引用组的(?1),而不是像Perl中的递归那样指向模式。不幸的是,Java 正则表达式不支持递归,但可以使用环视和反向引用来表达模式。

于 2013-07-10T00:21:12.813 回答