5

我是 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中有没有办法在正则表达式中引用以前匹配的组?

4

2 回答 2

0

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

所以你需要:

Pattern.compile("^\\s*((\\w\\d\\d\\d)(\\s+\\$2)*)?$")
于 2012-04-14T16:07:05.020 回答
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 + ")*)?$");

它并不优雅,但它可以完成工作。

于 2012-04-15T10:56:45.690 回答