特殊字符干扰了Java方法

特殊字符干扰了Java方法,java,Java,我使用string.replaceFirst()方法将的第一个实例替换为另一个字符串。我使用indexOf方法搜索两个括号,然后是replaceFirst方法。如果将文本替换为末尾带有字母数字字符的任何字符串,则它可以很好地工作,但在执行类似的操作时无法替换。该方法可供参考 public static String substituteWord(String original, String word) { int index1 = original.indexOf("

我使用string.replaceFirst()方法将
的第一个实例替换为另一个字符串。我使用indexOf方法搜索两个括号,然后是replaceFirst方法。如果将
文本
替换为末尾带有字母数字字符的任何字符串,则它可以很好地工作,但在执行类似
的操作时无法替换。该方法可供参考

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;
}
publicstaticstringsubstituteword(字符串原始,字符串字){
int index1=原始的.indexOf(“”);
故事情节=original.replaceFirst(original.substring(index1,index2+1),word);
归还原件;
}

代码看起来没有损坏,但为什么使用美元符号会导致此方法失败?

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

因此,解决方案是将第一个参数包装在Pattern.quote()中,将第二个参数包装在Matcher.quoteReplacement()中,以避免这种特殊行为:

String strToReplace = original.substring(index1,index2+1);
storyLine = original.replaceFirst(Pattern.quote(strToReplace), Matcher.quoteReplacement(word));

作为一个例子,当你想使用美元符号的特殊行为时,考虑这个例子:

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

str=str.replaceAll(([^严格来说,replaceFirst()和replaceAll()的第一个参数是一个正则表达式,替换字符串中的美元符号具有“与正则表达式匹配(捕获)的组x”的特殊含义

因此,解决方案是将第一个参数包装在Pattern.quote()中,将第二个参数包装在Matcher.quoteReplacement()中,以避免这种特殊行为:

String strToReplace = original.substring(index1,index2+1);
storyLine = original.replaceFirst(Pattern.quote(strToReplace), Matcher.quoteReplacement(word));

作为一个例子,当你想使用美元符号的特殊行为时,考虑这个例子:

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

str=str.replaceAll(“([^replaceFirst
的第一个参数是正则表达式。如果您只使用不带引号的原始用户输入,那么这肯定会导致问题,因为在您不期望的情况下,会解释正则表达式语法。请使用
replace
而不是
replaceFirst
(如果其行为可接受)或者
Pattern.quote
replaceFirst
的第一个参数上。您可能希望
返回故事情节;
您可能会对以下示例感兴趣:
replaceFirst
的第一个参数是一个正则表达式。如果您只使用不带引号的原始用户输入,那么这肯定会导致问题,因为ex语法将在您不期望的情况下进行解释。使用
replace
而不是
replaceFirst
(如果其行为可以接受)或
模式。在
replaceFirst
的第一个参数中引用
。您可能希望
返回故事情节;
您可能对以下示例感兴趣: