[英]Regex test failing - Java
我正在尝试一个简单的正则表达式执行。 基本上我想确定我的字符串中是否有特殊字符,如果是,请检查字符串的每个字符是否有两个特定字符,即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
---
我想这意味着你用来寻找特殊字符(不是数字或字母)的模式没有任何问题。 但我发现您的代码存在以下问题:
specials
计数,你只需要删除一行break
这样循环就不会在第一个特殊情况下停止; 一些建议
Character.isSpace()
与Character.isWhitespace()
作为第一个版本已经过时; specialCharValidity
以避免潜在的问题; Pattern p = Pattern.compile("[^a-zA-Z0-9 ]");
那样在每个调用上编译相同的模式Pattern p = Pattern.compile("[^a-zA-Z0-9 ]");
。 编译模式非常耗时,因此您可以在类的顶部定义常量,如static public final Pattern p = Pattern.compile("[^a-zA-Z0-9 ]");
并在以后使用它;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.