我要检查仅包含数字和数字的字符串:
public boolean checkPhoneNumberIsValid(String arg) {
return Pattern.compile("\\+[0-9]").matcher(arg).find();
}
当我尝试“ xxx”时,此操作将失败。当我尝试“ +3531234567”时,它正确通过了。但是,当我尝试“ + 35312ccc34567”时,错误地通过了。为什么会这样?
答案 0 :(得分:1)
我认为是因为find
方法在您的参数中找到单个子字符串匹配项。我建议使用matches
方法来检查完整的字符串是否匹配:
public boolean checkPhoneNumberIsValid(String arg) {
return Pattern.matches("\\+[0-9]+", arg);
}
[0-9]+
表示一个或多个数字。您错过了+
,因此您只能使用find
方法在字符串的开头匹配一个数字。
您还可以看到Pattern.matches
方法here。
但是,如果您确实要使用find
方法,则必须对正则表达式使用"\\+[0-9]+$"
来强制find
方法匹配完整的字符串。 $
表示字符串的结尾必须在此处。
另外,如果您打算经常调用checkPhoneNumberIsValid
,则应预先编译正则表达式,因为它更有效,如here所述:
private static final Pattern PHONE_NUMBER_REGEX = Pattern.compile("\\+[0-9]+");
public boolean checkPhoneNumberIsValid(String arg) {
return PHONE_NUMBER_REGEX.matcher(arg).matches();
}
答案 1 :(得分:1)
传递不正确的原因是因为您仅匹配+
之后的一位数字。您需要将整个字符串匹配到最后并检查它是否只有数字。尝试使用以下正则表达式:
\\+[0-9]+$
或
\\+\d+$
正则表达式末尾的 +
表示:Match one or more occurrence of [0-9]
。
查看此内容:https://regex101.com/r/0ufZPi/1
+3245edsfv //fail
+86569653386 //pass
+xxxx //fail
+234fsvfb7890 //fail