我在Regex搜索中使用多个组并替换字符串的许多部分。当使用String.replaceFirst时,我在Android JAVA中使用$ 1 $ 2等。
如果我在我的正则表达式搜索中使用超过九个组时尝试在replaceFirst中引用它们,例如$ 10,它将替换第一个后引用,然后打印文字0。
无论如何我可以使用第十个参考?是否有不同的参考方式?
示例,但我尝试使用超过9个反向引用。 10美元只看到1美元。
String.replaceFirst("(hello)(.*)(this)","$1middle$2");
答案 0 :(得分:0)
TL; DR 如果您遇到$10
被视为$1
和0
,那么您的正则表达式没有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}}