参考正则表达式中以前匹配的组

时间:2012-04-14 15:52:45

标签: java android regex

我是Android编码新手,但我有Perl正则表达式的经验。 我需要将0个或更多标识符的列表与正则表达式匹配,如:

^\s*((\w\d\d\d)(\s+$2)*)?$

注意$ 2指的是之前匹配的组(\ w \ d \ d \ d) 对于Android代码,它看起来像:

Pattern.compile("^\\s*((\\w\\d\\d\\d)(\\s+\$2)*)?$")

Eclipse编译器不编译\ $ 2,我也尝试了\ 2,编译但尝试匹配字面数字2。

蛮力解决方案是重复标识符模式:

Pattern.compile("^\\s*((\\w\\d\\d\\d)(\\s+(\\w\\d\\d\\d))*)?$")

它有效,但它有以下缺点: *在重复中很容易出现语法错误 *随着标识符变得越来越复杂,字符串越来越大 *它不优雅 *如果你不需要参考一个而不是之前几个匹配

,会变得更加复杂

Java中有没有办法引用正则表达式中以前匹配的组?

2 个答案:

答案 0 :(得分:0)

请记住,$不仅需要转义,而且\本身也需要转义!

所以你需要:

Pattern.compile("^\\s*((\\w\\d\\d\\d)(\\s+\\$2)*)?$")

答案 1 :(得分:0)

我很抱歉混乱,我的困惑。 正则表达式:

Pattern.compile("^\\s*((\\w\\d\\d\\d)(\\s+\\$2)*)?$")

将匹配“A12 A12”之类的内容,因此匹配上一场比赛。 (我只是在Eclipse上尝试过它并使用调试器跟随它)

我想要的是为“A12 B35 C36 A011”等字符串编写短正则表达式的方法 在perl中,您可以将变量用作模式的一部分,因此可以在perl中完成:

$a='\w\d\d\d';
$mystring =~ /^\s*(($a(\s+$a)*)?$/;

简短而简单。因此我假设在java中它也可以通过连接字符串来完成(我只是尝试了它并且它可以工作)

String id="\\w\\d\\d\\d";
Pattern.compile("^\\s*(" + id + "(\\s+" + id + ")*)?$");

它并不优雅,但却能胜任。