【问题标题】:Removing all characters but letters in a string删除字符串中除字母以外的所有字符
【发布时间】:2017-09-01 23:39:36
【问题描述】:

如果我有一个字符串"ja.v_,a",如何删除所有非字母字符以输出"java"?我试过str = str.replaceAll("\\W", "" ),但无济于事。

【问题讨论】:

  • 你使用什么编程语言?
  • 删除/替换[^a-z]? (即所有非字母 a..z 符号)
  • 我会使用一个 for 循环来检查每个字符。如果它是一个字符,我会连接到一个字符串。 Character.isAlphabetic() 是一个起点
  • 您是如何尝试删除它们的?您是在使用str.replaceAll(...) 的结果,还是只是将其作为语句调用?

标签: java string character punctuation


【解决方案1】:
String s = "ja.v_,a";
s = s.replaceAll("[^a-z]", "");
System.out.println(s);

>java

【讨论】:

    【解决方案2】:

    你能试试这个吗?

    System.out.println("ja.v_,a".replaceAll("[^a-zA-Z]", "")) //java
    

    【讨论】:

      【解决方案3】:

      我想参考this article并引用它:

      正则表达式示例和教程始终为您提供 [a-zA-Z0-9]+ 正则表达式来“验证字母数字输入”。它内置在许多验证框架中。这是完全错误的。这是一个绝对不能出现在代码中的任何地方的正则表达式,除非你有一个很好的解释。然而,这个例子无处不在。相反,正确的正则表达式是 [\p{L}0-9]+

      所以你的情况是:

      str.replaceAll("[^\\p{L}]", "");
      System.out.println("ja.v_,a".replaceAll("[^\\p{L}]", ""));
      System.out.println("сл-=о-_=во!".replaceAll("[^\\p{L}]", ""));
      

      \p{L} 是“字母”的 Unicode 定义。

      【讨论】:

      • 声明str.replaceAll("[^\p{L}]", ""); 没用。您需要以某种方式使用结果。
      • @AndyTurner 是的,我的意思是,在 2017 年,"a-z" 模式对于优秀的开发人员来说并不是最好的解决方案。我提到的文章中阐述了基本原理。
      • 这是一个重要的答案。我只会添加 \p{L} 是“字母”的 Unicode 定义的解释。
      • 并且根据标题“Unicode 类别”下的here,最好使用\P{M}\p{M}*+ 匹配1 个或多个Unicode 字符,因为带有变音符号的字母可能以不同的方式编码:@987654329 @
      【解决方案4】:
      String test= "ja.v_,a";
      
      int len=test.length();
      
      String alphaString="";
      
      for(int i=0; i<len; i++){
           if (Character.isLetter(test.charAt(i))) {
               alphaString=alphaString+test.charAt(i);
           }
      }
      
      System.out.println(alphaString);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-09
        • 2014-06-02
        • 1970-01-01
        • 2019-03-15
        • 2015-05-22
        • 2010-10-24
        相关资源
        最近更新 更多