我是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中有没有办法引用正则表达式中以前匹配的组?
答案 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 + ")*)?$");
它并不优雅,但却能胜任。