【问题标题】:Reference to previous matched groups within a regex引用正则表达式中的先前匹配组
【发布时间】:2012-04-26 15:39:30
【问题描述】:

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

【问题讨论】:

  • 你试过Pattern.compile("^\\s*((\\w\\d\\d\\d)(\\s+\\2)*)?$") 我认为反向引用是 \N 其中 N 是你的组。尽管您必须使用 \\N 反斜杠
  • 是的,我有,它将 \\2 作为文字数字 2(我忘记在原始帖子中使用双反斜杠,但这就是我的意思)。

标签: java android regex


【解决方案1】:

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

所以你需要:

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

【讨论】:

  • 我错了,我发现我的正则表达式有什么问题。我将能够在 7 小时内发布答案(新手限制)
【解决方案2】:

对不起,我的困惑,我的困惑。 正则表达式:

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 + ")*)?$");

它并不优雅,但它可以胜任。

【讨论】:

  • 一般来说,大多数语言将正则表达式编译器的输入视为字符串。 Perl 是一个例外:正则表达式已彻底融入该语言,以至于它们确实是程序的一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-13
  • 2021-01-31
  • 2016-12-08
相关资源
最近更新 更多