Android JAVA中的正则表达式 - 如何指定9个以上的反向引用?

时间:2017-11-09 00:00:51

标签: java android regex reference backreference

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

如果我在我的正则表达式搜索中使用超过九个组时尝试在replaceFirst中引用它们,例如$ 10,它将替换第一个后引用,然后打印文字0。

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

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

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

2 个答案:

答案 0 :(得分:0)

TL; DR 如果您遇到$10被视为$10,那么您的正则表达式没有10个捕获基团。

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

  

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

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

\$

这里我们将前11个字符捕获为单个组,例如System.out.println("ABCDEFGHIJKLMN".replaceFirst("(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)", "$11$10$9$3$2$1")); 返回group(1)"A"返回group(11)。输入字符串有14个字符,因此最后3个("K")不会被替换。结果是:

LMN

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

1

打印:

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

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

答案 1 :(得分:0)

您还可以使用${name} name them,然后使用String.replaceFirst("(?<g1>hello)(?<g2>.*)(?<g3>this)","${g1}middle${g2}"); 引用它们。

{{1}}