Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将^xb^x与正则表达式匹配_Java_Regex_Perl - Fatal编程技术网

Java 将^xb^x与正则表达式匹配

Java 将^xb^x与正则表达式匹配,java,regex,perl,Java,Regex,Perl,为了澄清,我想匹配: ab aabb aaabbb 这在Perl中工作: if ($exp =~ /^(a(?1)?b)$/) 要理解这一点,请将字符串视为从外到内而不是从左到右增长: ab a(ab)b aa(ab)bb (?1)是对外部括号集的引用。对于最后一种情况(从外到内),我们需要?,没有留下任何内容,?表示前面表达式的0或1(因此它基本上充当我们的基本情况) 我发布了一个类似的问题,问什么是Java中的等价(?1)?今天我发现\\1指的是第一个捕获组。因此,我假设这会起作用: S

为了澄清,我想匹配:

ab
aabb
aaabbb

这在Perl中工作:

if ($exp =~ /^(a(?1)?b)$/)
要理解这一点,请将字符串视为从外到内而不是从左到右增长:

ab
a(ab)b
aa(ab)bb

(?1)
是对外部括号集的引用。对于最后一种情况(从外到内),我们需要
,没有留下任何内容,
表示前面表达式的0或1(因此它基本上充当我们的基本情况)

我发布了一个类似的问题,问什么是Java中的等价
(?1)
?今天我发现
\\1
指的是第一个捕获组。因此,我假设这会起作用:

String pattern = "^(a(?:\\1)?b)$";
但事实并非如此。有人知道为什么吗


NB:我知道还有其他更好的方法。这完全是一个教育问题。正如在中一样,我想知道为什么这种特殊的方法不起作用,以及是否有办法解决它。

在Perl中,
\\1
是一个反向引用,指的是组的值,而不是递归
(?1)
所指的模式。不幸的是,Java正则表达式不支持递归,但是可以使用lookarounds和backrefs来表示模式。

是否
(?1)
的意思是“匹配正则表达式在第一组括号中指定的形式的某些内容”,或者“匹配第一个捕获组匹配的相同内容”
\\1
表示第二件事,但我能看到Perl正则表达式工作的唯一方法是如果
(?1)
表示第一件事。我在Perl RE中发现了以下注释:请注意,此模式的行为方式与相同形式的等效PCRE或Python构造不同。在Perl中,您可以回溯到递归组中,在PCRE和Python中,递归到组被视为原子。“不确定这是否是同一件事,但它可以解释为什么在Perl和Java中不以同样的方式工作。您有使用lookarounds和backrefs的解决方案吗?@SteveP.
a^nb^n
的搜索结果。享受吧。