【问题标题】:I can not use regex to replace text contain "\" character [duplicate]我不能使用正则表达式替换包含“\”字符的文本[重复]
【发布时间】:2021-04-22 10:08:29
【问题描述】:
我有一个sn-p
public static void main(String[] args) {
// replacement text
String replacement = "Not Set";
// text
String text = "Item A \\(XXX\\) Lock"; // text is "Item A\(XXX\)Lock"
String regex = "\\(XXX\\)"; // regex is "\(XXX\)"
// result text
String resultText = text.replaceAll(regex, replacement);
System.out.println("Result text: " + resultText);
}
resultText 是“Item A \(XXX\) Lock” -> 我无法将“\(XXX\)”替换为“Not Set”。
如果你知道这个问题,请帮助我。
【问题讨论】:
标签:
java
regex
replace
replaceall
regexp-replace
【解决方案1】:
字符\、( 和) 在正则表达式中使用时都有特殊含义。但是您不想使用它们具有特殊含义,这意味着您必须在正则表达式中对它们进行转义。这意味着在它们前面加上\,告诉正则表达式处理器不要调用这些字符的特殊含义。
换句话说,一个包含\\的正则表达式将匹配一个包含\的正则表达式
\( 将匹配 ( 等等。
要匹配\(XXX\),您想要的正则表达式将是\\\(XXX\\\) - 看看您想要匹配的每个\、( 和) 是如何有一个额外的\。但是要在 Java String 文字中指定此正则表达式,您需要编写 \\ 来代替每个 \。也就是说,你需要写
"\\\\\\(XXX\\\\\\)"。每一小段中都有六个\ 字符。
String regex = "\\\\\\(XXX\\\\\\)";
String resultText = text.replaceAll(regex, replacement);
【解决方案2】:
正则表达式语言在 Java 字符串文字转义序列之上有自己的转义序列。因此,要匹配反斜杠,您需要在正则表达式中使用 \\,因此在 Java 字符串文字中需要 \\\\
在这种情况下,您也可以使用Pattern.quote
text.replaceAll(Pattern.quote(regex), Matcher.quoteReplacement(replacement));