【问题标题】:Remove all punctuation from the end of a string删除字符串末尾的所有标点符号
【发布时间】:2015-10-23 17:27:46
【问题描述】:

示例

// 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 */, "");

有什么建议吗?

【问题讨论】:

  • 试试word = word.replaceAll("\\s*\\p{Punct}+\\s*$", "");。它应该删除所有标点符号并从右侧修剪字符串。

标签: java regex string


【解决方案1】:

我建议使用

\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

【讨论】:

  • Wiktor,这似乎不适用于以下内容: String word = "!Words word? - ";见:ideone.com/DKSKAP
  • @SaqibAli:您可以使用"(\\p{P}+\\s*)+$" 删除带有空格的连续标点符号。或者,如果您不太关心标点符号,请使用"[\\p{P}\\s]+$",它将从空格或标点符号或两者中删除右侧的所有字符串。
  • Wiktor,如何让它不删除括号?
  • \\p{P} 替换为[\\p{P}&&[^()]]
  • 要非常小心!像(\\p{P}+\\s*)+$ 这样的语句可能会导致runaway regular expression
【解决方案2】:

你可以使用:

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

也包括空格:

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

【讨论】:

    【解决方案3】:

    这个怎么样,如果你能在效率上受到一点影响。

    1. 反转输入字符串

    2. 不断删除字符,直到找到字母

    3. 反转字符串并返回

    【讨论】:

      【解决方案4】:

      我修改了你方法的逻辑

      public static boolean endsWithRegex(String word, String regex) {
      
              return word != null && !word.isEmpty() && word.matches(regex);
      }
      

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

      【讨论】:

        最近更新 更多