【问题标题】:Java regex: check if word has non alphanumeric charactersJava regex:检查单词是否包含非字母数字字符
【发布时间】:2011-03-31 20:49:32
【问题描述】:

这是我确定单词是否包含任何非字母数字字符的代码:

  String term = "Hello-World";
  boolean found = false;
  Pattern p = Pattern.Compile("\\W*");
  Matcher m = p.Matcher(term);
  if(matcher.find())
    found = true;

我想知道正则表达式是否错误。我知道"\W" 会匹配任何非单词字符。知道我缺少什么吗??

【问题讨论】:

    标签: java regex


    【解决方案1】:

    将您的正则表达式更改为:

    .*\\W+.*
    

    【讨论】:

      【解决方案2】:

      现在是 2016 年或更晚,您应该考虑来自其他字母的国际字符串,而不仅仅是拉丁语。在这种情况下,经常引用的[^a-zA-Z] 将不匹配。 Java 现在有更好的方法:

      [^\\p{IsAlphabetic}^\\p{IsDigit}]
      

      参见the reference(“Unicode 脚本、块、类别和二进制属性的类”部分)。还有 this answer 我觉得很有帮助。

      【讨论】:

        【解决方案3】:

        这是您正在寻找的表达式:

        "^[a-zA-Z0-9]+$"

        当它评估为 false 时,意味着不匹配,这意味着你找到了你想要的。

        【讨论】:

        • 别忘了 alpha_numeric_..."^[a-zA-Z0-9]+$"
        • 数字不匹配!
        • 对不起,我的英语可能骑不正确,但如果他想要阿尔法数字,最好的方法就是 vbence 所说的。我刚刚更新了答案。
        • 这是一个好点。在那种情况下,亚历克斯给出的答案会更好。但是,如果这是一个网络应用程序,我们也会遇到编码问题。比如汉字。我认为一个简单的正则表达式不能解决这个问题。让我们想象它是英语:)
        【解决方案4】:

        方法在错误的情况下。

        匹配器被声明为 m 但用作匹配器。

        重复应该是“一个或多个” + 而不是“零个或多个” * 这可以正常工作:

        String term = "Hello-World";
        boolean found = false;
        Pattern p = Pattern.compile("\\W+");//<-- compile( not Compile(
        Matcher m = p.matcher(term);  //<-- matcher( not Matcher
        if(m.find()) {  //<-- m not matcher
            found = true;
        }
        

        顺便说一句,只要你就足够了:

        boolean found = m.find();
        

        :)

        【讨论】:

          【解决方案5】:

          问题是'*''*' 匹配零个或多个字符。您要匹配至少一个非单词字符,因此您必须使用'+' 作为数量修饰符。因此匹配\W+(非单词大写W)

          【讨论】:

            【解决方案6】:

            你的表达没有考虑可能的非英文字母。它也比它需要的更复杂。除非您出于需要以外的其他原因使用正则表达式(例如您的教授告诉您),否则您最好:

            boolean found = false;
            for (int i=0;i<mystring.length();++i) {
              if (!Character.isLetterOrDigit(mystring.charAt(i))) {
                found=true;
                break;
              }
            }
            

            【讨论】:

            • isLetterOrDigit() 方法能识别中文、俄文、日文、印度文...字符吗?我不认为它可以。
            • @joe larson 酷,我不知道
            • @sfrj - java.lang.Character 提供了大量有用的 Unicode 感知实用方法,例如能够获取 unicode 类别 (Character.getType)。这是我构建 JavaScript unicode 字符 util github.com/joelarson4/CharFunk 的前提,它尽可能多地从 Java 中挖掘这种优点并使其在 JavaScript 中可用。
            【解决方案7】:

            当我不得不做同样的事情时,我使用的正则表达式是 "(\w)*" 这就是我使用的。不确定国会大厦 w 是否相同,但我也使用了括号。

            【讨论】:

            • 它们是不同的。 \W(大写字母)是 \w 的倒数 - 它将匹配 \w 字符类不匹配的任何字符。
            【解决方案8】:

            如果你可以使用Apache StringUtils,那么就这么简单

            StringUtils.isAlphanumeric(inp)
            

            【讨论】:

              【解决方案9】:
              if (value.matches(".*[^a-zA-Z0-9].*")) { // tested, seems to work.
                  System.out.println("match");
              } else {
                  System.out.println("no match");
              }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2012-12-27
                • 2016-05-19
                • 2012-03-15
                • 1970-01-01
                • 2021-10-01
                • 2015-01-04
                相关资源
                最近更新 更多