Java括号替换为空字符串

6
为什么第一行没有将“(”替换为空字符串,而第二行却做了?
 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);
 }
3个回答

4

replacereplaceFirst之间有区别。如果你的IDE展示了方法签名,你会看到:

enter image description here

你看见replace接受一个普通的targetreplaceFirst接受一个regex吗?

"\\("是意思是“一个左括号”的regexreplace不把你传递进去的字符串视为正则表达式。它只会尝试找一个反斜杠后面跟着一个左括号,这在你的字符串中不存在。

如果你想使用replace,只需使用"("即可。


这个 "(" 不是正则表达式吗?它不就是一个字符串吗? - Erik Nouroyan
@ErikNouroyan ( 不是有效的正则表达式。它不表示“匹配一个开括号”。\( 是一个有效的正则表达式,表示“匹配一个开括号”。在Java字符串字面量中,反斜杠被转义为\\ - Sweeper
为什么 replaceFirst 将 "\( " 视为单个括号而不是反斜杠和单个括号? - Erik Nouroyan
因为\(是一个正则表达式,表示“一个左括号”,而replaceFirst接受一个正则表达式。在正则表达式中,单独的(有特殊含义 - 开始一个捕获组,所以你需要用\转义它来表示“一个左括号”。@ErikNouroyan - Sweeper
请问您可以分享一个有效的正则表达式学习链接吗? - Erik Nouroyan
@ErikNouroyan 如果您认为我的回答解决了您的问题,请考虑点击那个勾选标记接受它! - Sweeper

3

使用replace方法,你需要这样书写:

a=a.replace("(",""); //First

如果您想传递一个正则表达式,可以使用replaceAll

a=a.replaceAll("\\(",""); //First

replace 接受要替换的字符序列:

public String replace(CharSequence target, CharSequence replacement)

因此,在您的情况下,它尝试替换3个字符“\(”,而不仅仅是单个字符“(”。

那么为什么这个不起作用呢? a=a.replace("(",""); //首先 - Erik Nouroyan
@ErikNouroyan replace 函数的第一个参数不接受正则表达式。因此它试图替换实际子字符串 "\(",但该子字符串在 a 中不存在。 - Eran

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);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接