为什么第一行不用空字符串替换“(”,而第二行呢?
public static void main(String []args){
String a="This(rab)(bar)";
a=a.replace("\\(",""); //First
String b=a.replaceFirst("\\(","");//Second
System.out.println(a + " "+b);
}
答案 0 :(得分:4)
replace
和replaceFirst
之间存在区别。如果您的IDE向您显示了方法签名,您将看到:
看看replace
如何接受普通的target
而replaceFirst
如何接受regex
?
"\\("
是 regex ,表示“单个圆括号”。 replace
不会将您传入的字符串视为正则表达式。它将仅尝试查找反斜杠,然后在其字符串中不存在带括号的反括号。
如果要使用replace
,只需使用"("
。
答案 1 :(得分:3)
要使replace
工作,您应该写:
a=a.replace("(",""); //First
或如果要传递replaceAll
,请使用regex
:
a=a.replaceAll("\\(",""); //First
replace
接受要替换的字符序列:
public String replace(CharSequence target, CharSequence replacement)
因此,在您的情况下,它将尝试替换3个字符“ \(”,而不仅仅是单个字符“(”。
答案 2 :(得分:0)
问题在于它以几个字符在replace
中运行,因此,它将查找\
和(
,因此不会发生引号应仅包含要替换的字符:
a = a.replace("(", ""); // First
接下来,我将原始提案和固定提案留给狙击手:
public class Main {
private static final Main initRun = new Main();
public static void main(String[] args) {
String a = "This(rab)(bar)";
System.out.println("Original");
initRun.runOriginal(a);
System.out.println("Fixed");
initRun.runFixed(a);
// Output
// Original
// This(rab)(bar)
// Thisrab)(bar)
// Fixed
// Thisrab)bar)
// Thisrab)bar)
}
/**
* Execute the original proposal
*
* @param a String for replace
*/
void runOriginal(String a) {
a = a.replace("\\(", ""); // First
String b = a.replaceFirst("\\(", "");// Second
System.out.println(a + "\n" + b);
}
/**
* Execute the fixed proposal
*
* @param a String for replace
*/
void runFixed(String a) {
a = a.replace("(", ""); // First
String b = a.replaceFirst("\\(", "");// Second
System.out.println(a + "\n" + b);
}
}