正则表达式匹配组

时间:2013-04-17 18:45:45

标签: java regex string

我遇到了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世界中具有特殊意义的角色做这个。

3 个答案:

答案 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(),它不使用正则表达式进行文字替换。