【问题标题】:Regex in Android JAVA - How to specify more than 9 backreferences?Android JAVA 中的正则表达式 - 如何指定超过 9 个反向引用?
【发布时间】:2017-11-09 00:00:51
【问题描述】:

我在正则表达式搜索中使用多个组并替换字符串的许多部分。使用 String.replaceFirst 时,我在 Android JAVA 中使用 $1 $2 等。

如果尝试在 replaceFirst 中引用它们时在 Regex 搜索中使用超过九个组,例如 $10 ,它将替换第一个反向引用,然后打印文字 0。

无论如何我可以使用第十个参考吗?有不同的引用方式吗?

示例,但我尝试使用超过九个反向引用。 10 美元只能看到 1 美元。

String.replaceFirst("(hello)(.*)(this)","$1middle$2");

【问题讨论】:

标签: java android regex reference backreference


【解决方案1】:

TL;DR 如果您发现 $10 被视为 $10,那么您的正则表达式没有 10 个捕获组。

替换值中的$ 反向引用记录在appendReplacement 方法的javadoc 中:

替换字符串可能包含对在上一场比赛中捕获的子序列的引用:${name}$g 的每次出现将分别由对应的 group(name)group(g) 的评估结果替换。对于$g$ 之后的第一个数字始终被视为组引用的一部分。 如果后续编号将构成合法的组引用,则它们将被并入g只有数字'0''9' 被视为组引用的潜在组成部分。例如,如果第二组匹配字符串"foo",则传递替换字符串"$2bar" 将导致"foobar" 被附加到字符串缓冲区。美元符号 ($) 可以作为文字包含在替换字符串中,方法是在其前面加上反斜杠 (\$)。

所以,假设我们有 11 个组:

System.out.println("ABCDEFGHIJKLMN".replaceFirst("(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)",
                                                 "$11$10$9$3$2$1"));

在这里,我们将前 11 个字符捕获为单独的组,例如group(1) 返回 "A"group(11) 返回 "K"。输入字符串有 14 个字符,因此最后 3 个 (LMN) 不会被替换。结果是:

KJICBALMN

如果我们从正则表达式中删除捕获组 11,则 $11 不是合法的组引用,将被解释为 $1 和文字 1

System.out.println("ABCDEFGHIJKLMN".replaceFirst("(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)",
                                                 "$11$10$9$3$2$1"));

打印:

A1JICBAKLMN

因此,如果您发现 $10 被视为 $1 反向引用和文字 0,那么 您的正则表达式没有 10 个组

【讨论】:

  • 嗨,我试过你的例子。我正在使用安卓工作室。它使用的 Android JAVA 版本一定不支持这个。我得到这个输出 - A1A0ICBALMN
【解决方案2】:

您也可以使用(?<name>...) name them,然后使用${name} 引用它们。

String.replaceFirst("(?<g1>hello)(?<g2>.*)(?<g3>this)","${g1}middle${g2}");

【讨论】:

    猜你喜欢
    • 2011-03-19
    • 2016-06-30
    • 2018-07-13
    • 1970-01-01
    • 2013-10-04
    • 2014-10-15
    • 2012-11-06
    • 1970-01-01
    相关资源
    最近更新 更多