正则表达式测试失败-Java

正则表达式测试失败-Java,java,regex,Java,Regex,我正在尝试一个简单的正则表达式执行。基本上,我想确定我的字符串中是否有特殊字符,如果有,检查字符串中的每个字符是否有两个特定字符,即hypen和dot 我似乎在第一位遇到了一个问题,这涉及到确定字符串中是否有特殊字符 下面是我尝试执行此操作的方法,后面是我遇到问题的字符串: public static boolean stringValidity(String input) { int specials = 0; Pattern p = Pattern.compile("[^a

我正在尝试一个简单的正则表达式执行。基本上,我想确定我的字符串中是否有特殊字符,如果有,检查字符串中的每个字符是否有两个特定字符,即hypen和dot

我似乎在第一位遇到了一个问题,这涉及到确定字符串中是否有特殊字符

下面是我尝试执行此操作的方法,后面是我遇到问题的字符串:

public static boolean stringValidity(String input) {
    int specials = 0;

    Pattern p = Pattern.compile("[^a-zA-Z0-9 ]");
    Matcher m = p.matcher(input);
    boolean b = m.find();

    if (b) {
        System.out.println("\nstringValidity - There is a special character in my string");

        for (int i = 0; i < input.length(); ++i) {

           char ch = input.charAt(i);

           //if (!Character.isDigit(ch) && !Character.isLetter(ch) && !Character.isSpace(ch)) {
              ++specials;

              System.out.println("\nstringValidity - Latest number of special characters is: " + specials);

              if((ch == '-') | (ch == '.')) {
                  specialCharValidity = true;

                  System.out.println("\nstringValidity - CHAR is valid - specialCharValidity is: " + specialCharValidity + " as char is: " + ch);
              } else {
                  specialCharValidity = false;

                  System.out.println("\nstringValidity - CHAR is invalid - specialCharValidity is: " + specialCharValidity + " as char is: " + ch);

                  break;
              }
           //}
        }
    } else {
        System.out.println("\nstringValidity - There is NO special character in my string");

        specialCharValidity = true;
    }

    return specialCharValidity;
}
下面是我传递给方法的字符串,我希望这些字符串不会被视为带有特殊字符的字符串,但测试失败:

"QWERTY"!£$"£$"
"sdfGSDFGSDFG%*^(%*&("
"QWE12342134RTY"
"LOREMIPSUM2354214"

非常感谢您的建议。

您可以根据以下模式检查字符串,从而简化代码:

[^a-zA-Z0-9\-\.]
字符串有效性函数归结为:

public static boolean stringValidity(String input) 
{
    return Pattern.compile("[^a-zA-Z0-9 \\-\\.]").matcher(input).find() == false;
}

使用提供的字符串运行代码时,我得到了以下输出:

stringValidity - There is a special character in my string

stringValidity - Latest number of special characters is: 1

stringValidity - CHAR is invalid - specialCharValidity is: false as char is: Q
---

stringValidity - There is a special character in my string

stringValidity - Latest number of special characters is: 1

stringValidity - CHAR is invalid - specialCharValidity is: false as char is: s
---

stringValidity - There is NO special character in my string
---

stringValidity - There is NO special character in my string
---
我想这意味着你用来查找特殊字符(不是数字或字母)的模式没有问题。但我发现您的代码存在以下问题:

  • 确保正确地将这些字符串作为参数传递。列表中的第一个字符串应该声明为“QWERTY\”!一旦java要求字符串中的双引号前面加反斜杠,以避免被解释为字符串分隔符,程序中的“£$\”£$”
  • 测试的第二部分不起作用,因为您只测试字符串中的第一个字符。您的逻辑是这样的:“如果当前字符是点或连字符,则specialCharValidity=true,否则(如果它是点和连字符以外的任何其他无效或有效字符),只需将specialCharValidity=false并中断循环”。奇怪的是,您已经做了正确的事情:只需重新启用已注释的行,以列出正确的无效字符。如果要启用
    特价商品的计数
    只需使用
    break
    删除行,这样循环就不会在第一个特价商品中停止 一些建议

    • Character.isSpace()
      替换为
      Character.isWhitespace()
      ,因为第一个版本已经不推荐使用
    • 在本地定义
      specialCharValidity
      ,以避免潜在问题
    • 为了提高性能,不要像在
      pattern p=pattern.compile(“[^a-zA-Z0-9]”行中那样在每次调用时编译相同的模式。编译模式非常耗时,因此您可以在类的顶部定义一个常量,如
      static public final pattern p=pattern.compile(“[^a-zA-Z0-9]”)
      并稍后使用
    • 模式是匹配复杂字符串模式的极好工具,但在这种情况下有点过头了。如果您只需要像这样匹配/查找字符,那么最好单独进行字符比较,因为模式只会增加不必要的开销

    对我有用<代码>模式。编译(“[^a-zA-Z0-9]”)。匹配器(“SDFG%^(%%&(“).find()返回
    true
    模式。编译([^a-zA-Z0-9]”)。匹配器(“QWE12342134RTY”).find()返回False,如果您取消注释注释掉的行,函数类型会起作用。@Dima和Salaman:在取消注释if语句并将模式更改为[^a-zA-Z0-9\\-\\\\\\\\\\\\\\\\\\\\\.]之后,它起作用了。感谢您的建议感谢您的回复。我再次尝试了我的代码,但将[^a-zA-Z0-9\\-\\\\\\\\\\\\\\\\\\\\\\\\\.]作为模式,而不是[^a-zA-Z0-9]。基本上基于ulix的回复,取消注释我所做的检查,即isDigit()、Isleter()和isWhiteSpace(),使我能够测试超过第一个字符。我使用我在原始帖子中提到的字符串进行了测试。我也非常感谢您提出的额外建议,我已经实施了这些建议,并让我清理了代码。