特殊字符干扰Java方法



我正在使用string. replacefirst()方法,以便用另一个字符串替换<text>的第一个实例。我使用indexOf方法搜索两个括号,然后使用replaceFirst方法。如果text被替换为末尾带有字母数字字符的任何字符串,则它可以完美地工作,但是当我做<some string$>之类的事情时无法替换。作为参考,方法为

public static String substituteWord(String original, String word) {
int index1 = original.indexOf("<");
int index2 = original.indexOf(">");
storyLine = original.replaceFirst(original.substring(index1,index2+1), word);
return original;
}

代码看起来没有问题,但是为什么使用美元符号会使这个方法失败?

严格地说,replaceFirst()和replaceAll()的第一个参数是一个正则表达式,替换字符串中的美元符号具有特殊的含义,即'组x与正则表达式匹配(被捕获)'。

因此,解决方案是将第一个参数包装在Pattern.quote()中,第二个参数包装在matcher . quoterreplace()中,以避免这种特殊行为:
String strToReplace = original.substring(index1,index2+1);
storyLine = original.replaceFirst(Pattern.quote(strToReplace), Matcher.quoteReplacement(word));

作为您希望使用美元符号的特殊行为的示例,请考虑以下示例:

str = str.replaceAll("<b>([^<]*)</b>", "<i>$1</i>");

这将从一些HTML中取出一段粗体文本,并将其替换为"粗体标签内的任何内容,但要用斜体代替"。正则表达式中的括号()表示"捕获此子字符串"作为第1组,然后$1表示"用捕获的任何内容替换为第1组"。

最新更新