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

13

示例:

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

目前的解决方案可以工作,但由于它已经在endsWithRegex中调用了String.replaceAll,所以我们应该能够像这样做:

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

有什么建议吗?


2
尝试使用 word = word.replaceAll("\\s*\\p{Punct}+\\s*$", "");。它可以删除所有标点符号,并从右侧修剪字符串。 - Wiktor Stribiżew
4个回答

7
我建议使用:
\s*\p{Punct}+\s*$

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

如果您不关心空格,只需使用\p{Punct}+$

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

Java演示

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

Wiktor,这似乎对以下内容不起作用:String word =“!Words word? - ”;请参见:http://ideone.com/DKSKAP - Saqib Ali
1
@SaqibAli:您可以使用"(\\p{P}+\\s*)+$"来删除连续的标点符号和空格。或者如果您不太关心标点符号,可以使用"[\\p{P}\\s]+$",它将从右侧修剪所有字符串,包括空格或标点符号或两者都有。 - Wiktor Stribiżew
Wiktor,我该如何使其不删除括号? - Saqib Ali
1
\\p{P} 替换为 [\\p{P}&&[^()]] - Wiktor Stribiżew
非常小心!像 (\\p{P}+\\s*)+$ 这样的语句可能会导致无限制正则表达式 - david
正确的正则表达式应该是 "\\p{P}[\\p{P}\\s]*$",而不是 "(\\p{P}+\\s*)+$",我现在不会建议使用它。但我认为 "(?U)[\\p{P}\\s]+$" / "(?U)[\\p{P}\\p{S}\\s]+$" 对于大多数用户来说是最好的选择。 - Wiktor Stribiżew

1
您可以使用:

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

包括空格:

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

0

我已经修改了你的方法的逻辑

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

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

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


0

如果你可以在效率上稍微牺牲一点,那么这个方案怎么样呢?

  1. 反转输入字符串

  2. 不断删除字符,直到遇到字母为止

  3. 反转字符串并返回


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