特殊字符干扰了Java方法
我使用string.replaceFirst()方法将特殊字符干扰了Java方法,java,Java,我使用string.replaceFirst()方法将的第一个实例替换为另一个字符串。我使用indexOf方法搜索两个括号,然后是replaceFirst方法。如果将文本替换为末尾带有字母数字字符的任何字符串,则它可以很好地工作,但在执行类似的操作时无法替换。该方法可供参考 public static String substituteWord(String original, String word) { int index1 = original.indexOf("
的第一个实例替换为另一个字符串。我使用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
的第一个参数中引用。您可能希望返回故事情节;
您可能对以下示例感兴趣: