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

Android JAVA中的正则表达式-如何指定9个以上的反向引用?,java,android,regex,reference,backreference,Java,Android,Regex,Reference,Backreference,我在正则表达式搜索中使用多个组,并替换字符串的许多部分。我在Android JAVA中使用String.replaceFirst时使用了$1$2等 如果在replaceFirst(例如$10)中尝试引用九个以上的组时,我在正则表达式搜索中使用了九个以上的组,它将替换第一个反向引用,然后打印一个文本0 还有什么我可以用第十个参考资料吗?有不同的引用方式吗 例如,但我尝试使用九个以上的反向引用$10只看到1美元 String.replaceFirst("(hello)(.*)(this)","$1m

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

如果在replaceFirst(例如$10)中尝试引用九个以上的组时,我在正则表达式搜索中使用了九个以上的组,它将替换第一个反向引用,然后打印一个文本0

还有什么我可以用第十个参考资料吗?有不同的引用方式吗

例如,但我尝试使用九个以上的反向引用$10只看到1美元

String.replaceFirst("(hello)(.*)(this)","$1middle$2");
TL;DR如果您体验到
$10
被视为
$1
0
,则您的正则表达式没有10个捕获组

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

替换字符串可能包含对上一次匹配期间捕获的子序列的引用:
${name}
$g
的每次出现都将被分别计算相应的
组(名称)
组(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个组

您也可以使用
(?…)
然后使用
${name}
引用它们

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

试试
${10}
。虽然在Java中,.Hi,我试过你的例子。我正在使用Android Studio。它使用的Android JAVA版本不能支持这一点。我得到这个输出-A1A0ICBALMN