【问题标题】:Regex to remove only special characters and not other language letters正则表达式仅删除特殊字符而不删除其他语言字母
【发布时间】:2018-12-03 17:42:01
【问题描述】:

我使用正则表达式从名称中删除特殊字符。该表达式将删除除英文字母之外的所有字母。

public static void main(String args[]) {
    String name = "Özcan Sevim.";
    name = name.replaceAll("[^a-zA-Z\\s]", " ").trim();
    System.out.println(name);
}

输出:

zcan Sevim

预期输出:

Özcan Sevim 

我这样做的结果很糟糕,正确的方法是删除基于 ASCII 码的特殊字符,这样其他字母就不会被删除,有人可以帮助我使用只删除特殊字符的正则表达式。

【问题讨论】:

  • 为什么不使用包含所有特殊字符的正则表达式?因此,不要创建白名单,而是创建黑名单

标签: java regex string regex-negation


【解决方案1】:

您可以使用\p{IsLatin}\p{IsAlphabetic}

name = name.replaceAll("[^\\p{IsLatin}]", " ").trim();

或者要删除标点符号,只需像这样使用\p{Punct}

name = name.replaceAll("\\p{Punct}", " ").trim();

输出

Özcan Sevim

查看Summary of regular-expression constructs 的完整列表并使用对您有帮助的那个。

【讨论】:

    【解决方案2】:

    为此使用 Guava CharMatcher :) 它会更容易阅读和维护。

    name = CharMatcher.ASCII.negate().removeFrom(name);
    

    【讨论】:

      【解决方案3】:

      使用 [\W+] 或 "[^a-zA-Z0-9]" 作为正则表达式来匹配任何特殊字符,并使用 String.replaceAll(regex, String) 将 spl 字符替换为空字符串。请记住,String.replaceAll 的第一个 arg 是一个正则表达式,您必须使用反斜杠对其进行转义才能将 em 视为文字字符。

       String string= "hjdg$h&jk8^i0ssh6";
              Pattern pt = Pattern.compile("[^a-zA-Z0-9]");
              Matcher match= pt.matcher(string);
              while(match.find())
              {
                  String s= match.group();
              string=string.replaceAll("\\"+s, "");
              }
              System.out.println(string);
      

      【讨论】:

        猜你喜欢
        • 2016-05-26
        • 1970-01-01
        • 1970-01-01
        • 2019-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多