【问题标题】:Replacing all non-alphanumeric characters with empty strings用空字符串替换所有非字母数字字符
【发布时间】:2010-12-20 19:15:50
【问题描述】:

我试过用这个但是没用-

return value.replaceAll("/[^A-Za-z0-9 ]/", "");

【问题讨论】:

  • 伙计们,你忘了还有拉丁字母以外的字母。
  • 但是如果你想验证一个主机名,最好排除无效的字母。

标签: java regex non-alphanumeric


【解决方案1】:

使用[^A-Za-z0-9]

注意:删除空格,因为它通常不被视为字母数字。

【讨论】:

  • 字符类末尾的空格也不应该。
  • 正则表达式没问题,只需从 value.replaceAll("/[^A-Za-z0-9 ]/", "");到 value.replaceAll("[^A-Za-z0-9 ]", "");您不需要正则表达式中的“/”,我认为您已经与 javascript 模式混淆了
  • 请注意,这仅适用于拉丁字母,不适用于重音字符或任何“特殊”字符集。
【解决方案2】:

试试

return value.replaceAll("[^A-Za-z0-9]", "");

return value.replaceAll("[\\W]|_", "");

【讨论】:

  • 带下划线,return value.replaceAll("\\W", "");
  • 当然。编译器很擅长发现这类事情。
  • 第二个没有回答问题。像 : / \ 之类的字符呢?
【解决方案3】:

您应该知道[^a-zA-Z] 将替换字符范围 A-Z/a-z 中不属于自身的字符。这意味着éß 等特殊字符或西里尔字符等将被删除。

如果不想替换这些字符,请改用预定义的字符类:

 str.replaceAll("[^\\p{IsAlphabetic}\\p{IsDigit}]", "");

PS:\p{Alnum} 没有达到这个效果,它的作用和[A-Za-z0-9] 一样。

【讨论】:

  • 非常感谢这篇文章 - 它对我非常有用。此外,我相信这是问题的实际答案。拉丁字母不是世界上唯一的!
  • 实际上,所述正则表达式会将“^”视为有效字符,因为只有第一次出现的“^”会否定选择的含义。 [^\\p{IsAlphabetic}\\p{IsDigit}] 效果很好。
  • @JakubTurcovsky docs.oracle.com/javase/10/docs/api/java/util/regex/Pattern.html 将 IsAlphabetic 和 IsDigit 定义为二进制属性。 Alpha 和 Digit 是 POSIX 字符类(仅限 US-ASCII)。除非指定了 docs.oracle.com/javase/10/docs/api/java/util/regex/… 标志。
  • @AndreSteingress 正确,{IsDigit} 对我不起作用而 {Digit} 起作用的原因是我正在 Android 上尝试这个。 Android 默认开启了UNICODE_CHARACTER_CLASS。感谢您的许可。
  • 如何只允许字母、数字和表情符号?
【解决方案4】:
return value.replaceAll("[^A-Za-z0-9 ]", "");

这将保留个空格。我想这就是你想要的。否则,从正则表达式中删除空格。

【讨论】:

    【解决方案5】:

    你也可以试试这个更简单的正则表达式:

     str = str.replaceAll("\\P{Alnum}", "");
    

    【讨论】:

    • 或者,保留空格:str.replaceAll("[^\\p{Alnum}\\s]", "")
    • \\p{Alnum}\\p{Space}
    【解决方案6】:

    Java 的正则表达式不需要您在正则表达式周围放置正斜杠 (/) 或任何其他分隔符,这与 Perl 等其他语言不同。

    【讨论】:

      【解决方案7】:

      解决方案:

      value.replaceAll("[^A-Za-z0-9]", "")

      说明:

      [^abc] 当插入符号 ^ 作为方括号内的第一个字符出现时,它否定了该模式。此模式匹配除 a 或 b 或 c 之外的任何字符。

      将关键字视为两个功能:

      • [(Pattern)] = match(Pattern)
      • [^(Pattern)] = notMatch(Pattern)

      另外关于模式:

      • A-Z = all characters included from A to Z

      • a-z = all characters included from a to z

      • 0=9 = all characters included from 0 to 9

      因此它将替换所有未包含在模式中的字符

      【讨论】:

        【解决方案8】:

        我用这个方法来创建文件名:

        public static String safeChar(String input)
        {
            char[] allowed = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_".toCharArray();
            char[] charArray = input.toString().toCharArray();
            StringBuilder result = new StringBuilder();
            for (char c : charArray)
            {
                for (char a : allowed)
                {
                    if(c==a) result.append(a);
                }
            }
            return result.toString();
        }
        

        【讨论】:

        • 这很暴力。正则表达式是解决 OP 情况的方法。
        • 你说得对,正则表达式更好。但当时,我和 regex 相处得并不顺利。
        • 哈,有人真的和正则表达式相处得那么好吗? ;)
        【解决方案9】:

        如果您还想允许不属于 ascii 字符集的字母数字字符,例如德语变音符号,您可以考虑使用以下解决方案:

         String value = "your value";
        
         // this could be placed as a static final constant, so the compiling is only done once
         Pattern pattern = Pattern.compile("[^\\w]", Pattern.UNICODE_CHARACTER_CLASS);
        
         value = pattern.matcher(value).replaceAll("");
        

        请注意,使用 UNICODE_CHARACTER_CLASS 标志可能会对性能造成影响(请参阅此标志的 javadoc)

        【讨论】:

          【解决方案10】:

          使用 Guava,您可以轻松组合不同类型的标准。对于您的具体解决方案,您可以使用:

          value = CharMatcher.inRange('0', '9')
                  .or(CharMatcher.inRange('a', 'z')
                  .or(CharMatcher.inRange('A', 'Z'))).retainFrom(value)
          

          【讨论】:

            【解决方案11】:

            简单方法:

            public boolean isBlank(String value) {
                return (value == null || value.equals("") || value.equals("null") || value.trim().equals(""));
            }
            
            public String normalizeOnlyLettersNumbers(String str) {
                if (!isBlank(str)) {
                    return str.replaceAll("[^\\p{L}\\p{Nd}]+", "");
                } else {
                    return "";
                }
            }
            

            【讨论】:

              【解决方案12】:
              public static void main(String[] args) {
                  String value = " Chlamydia_spp. IgG, IgM & IgA Abs (8006) ";
              
                  System.out.println(value.replaceAll("[^A-Za-z0-9]", ""));
              
              }
              

              输出:衣原体IgGIgMIgAAbs8006

              Github:https://github.com/AlbinViju/Learning/blob/master/StripNonAlphaNumericFromString.java

              【讨论】:

                【解决方案13】:

                Guava 的CharMatcher 提供了简洁的解决方案:

                output = CharMatcher.javaLetterOrDigit().retainFrom(input);
                

                【讨论】:

                  猜你喜欢
                  • 2012-09-04
                  • 2012-10-10
                  • 2010-12-01
                  • 1970-01-01
                  • 2011-11-23
                  • 2018-11-25
                  • 1970-01-01
                  • 2017-07-09
                  • 2010-09-20
                  相关资源
                  最近更新 更多