从字符串末尾删除所有标点符号

时间:2015-10-23 17:27:46

标签: java regex string

实施例

// A B C.       -> A B C
// !A B C!      -> !A B C
// A? B?? C???  -> A? B?? C

这是我到目前为止所拥有的:

while (endsWithRegex(word, "\\p{P}")) {
    word = word.substring(0, word.length() - 1);
}

public static boolean endsWithRegex(String word, String regex) {
    return word != null && !word.isEmpty() && 
        word.substring(word.length() - 1).replaceAll(regex, "").isEmpty();
}

这个当前的解决方案有效,但由于它已在String.replaceAll内调用endsWithRegex,我们应该能够做到这样的事情:

word = word.replaceAll(/* regex */, "");

有什么建议吗?

4 个答案:

答案 0 :(得分:5)

我建议使用

\s*\p{Punct}+\s*$

它将匹配字符串末尾的可选空格和标点符号。

如果您不关心空白,请使用\p{Punct}+$

不要忘记在Java字符串中,反斜杠应该加倍以表示文字反斜杠(必须用作正则表达式转义符号)。

Java demo

String word = "!Words word! ";
word = word.replaceAll("\\s*\\p{Punct}+\\s*$", "");
System.out.println(word); // => !Words word

答案 1 :(得分:1)

您可以使用:

str = str.replaceFirst("\\p{P}+$", "");

还包括空格:

str = str.replaceFirst("[\\p{Space}\\p{P}]+$", "")

答案 2 :(得分:0)

如果你能在效率方面受到轻微打击,那怎么样呢。

  1. 反转输入字符串

  2. 继续删除字符,直到您输入字母

  3. 反转字符串并返回

答案 3 :(得分:0)

我修改了你方法的逻辑

public static boolean endsWithRegex(String word, String regex) {

        return word != null && !word.isEmpty() && word.matches(regex);
}

你的正则表达式是:regex = ".*[^a-zA-Z]$";