replaceAll()工作一次,但不是两次?

时间:2017-06-03 11:48:41

标签: java

我有这种方法,它可以按预期工作:

public void splitReplaceAndPrint()
{
    words = new String[200];

    String bookReplacedWithNoCommas = book.replaceAll(",", "");

    words = bookReplacedWithNoCommas.split(" ");

    for(int i = 0; i < words.length; i++)
    {
        System.out.println(words[i]);
    }
}

但如果我试图删除这些点,就像这样......:

public void splitReplaceAndPrint()
{
    words = new String[200];

    String bookReplacedWithNoCommas = book.replaceAll(",", "");
    String bookReplacedWithNoPoints = bookReplacedWithNoCommas.replaceAll(".", "");

    words = bookReplacedWithNoPoints.split(" ");

    for(int i = 0; i < words.length; i++)
    {
        System.out.println(words[i]);
    }
}

......什么都没打印出来。为什么这不起作用?

2 个答案:

答案 0 :(得分:7)

因为.意味着什么,所以逃避它。

正则表达式中的

.将匹配任何字符,因此它将替换字符串中的所有内容,因此您应该利用replace代替昂贵的正则表达式

 book.replace(",", "");

或 同时删除,.

 book.replaceAll("[.,]", "");

[.,][]表示character class,表示与逗号和点匹配

以防万一,如果您想使用replace删除单个字符,那么您可以将replace函数链应用为

String book ="The .bo..ok of ,eli..";
book.replace(",","").replace(".",""); // The book of eli

答案 1 :(得分:3)

你需要逃避点,否则,它将匹配任何角色。这种转义是必要的,因为replaceAll将第一个参数视为正则表达式。您案例中replaceAll的第一个参数应该是\\.而不是.,即

String bookReplacedWithNoPoints = bookReplacedWithNoCommas.replaceAll("\\.", "");