我遇到了Java字符串
的replaceAll函数的问题replaceAll("regex", "replacement");
工作正常,但每当我的“替换”字符串包含像“$ 0”,“$ 1”.e.t.c这样的子字符串时,它会通过用相应的匹配组替换这些$ x来产生问题。
例如
input ="NAME";
input.replaceAll("NAME", "HAR$0I");
将导致字符串“HARNAMEI”,因为替换字符串包含“$ 0”,它将被匹配的组“NAME”替换。我怎样才能超越这种本性。我需要将结果字符串仅作为“HAR $ 0I”。
我逃过$ .i.e我将替换字符串转换为“HAR \\ $ 0I”,这很好。但我正在寻找java中的任何方法,为我所有这些在regex世界中具有特殊意义的角色做这个。
答案 0 :(得分:1)
java.lang.String.replaceAll()的文档说:
请注意替换中的反斜杠()和美元符号($) 字符串可能会导致结果与正确的结果不同 被视为字面替换字符串;见Matcher.replaceAll。使用 Matcher.quoteReplacement(java.lang.String)压制特殊 如果需要,这些字符的含义。
String quoteReplacement(String s)的文档说:
返回指定String的文字替换String。这个 方法生成一个String,它将作为文字替换 Matcher类的appendReplacement方法。字符串产生了 将匹配被视为文字的s中的字符序列 序列。斜杠('\')和美元符号('$')将被拒绝 特殊意义。
答案 1 :(得分:0)
$
中的 replacement
是允许您使用群组的特殊字符。要使其成为文字,您需要使用\$
来转义它,需要将其写为"\\$"
。同样的规则适用于\
,因为它是用于转义$
的特殊字符。如果您想要替换\
字面值,则还需要使用另一个\
转义它,因此您需要将其写为\\\\
。
要简化此过程,您只需使用Matcher.quoteReplacement("yourReplacement"))
。
如果您不需要使用正则表达式,您可以进一步简化它并使用
replace("NAME", "HAR$0I")
而不是
replaceAll("NAME", Matcher.quoteReplacement("HAR$0I"))
答案 2 :(得分:0)
听起来你实际上是在尝试替换原始字符串,而根本不使用正则表达式。
你应该简单地调用String.replace()
,它不使用正则表达式进行文字替换。