java - 该方法在使用matches()、正则表达式、尝试验证电话号码时无法正常工作
问题描述
下午好,我需要编写一个验证电话号码的方法。我需要的数字只能包含数字(0-9)和这些字符 : "()" "-" "+"
,但其他一切都是禁止的!
例如 :
+210-998-234-01234 -OK
210-998-234-01234-OK
+21099823401234-OK
+210-998-234-01234 -OK
+210-(998)-(234)-(01234) - OK
+210-99A-234-01234 - FALSE , +210-999-234-0""234 -FALSE , +210-999-234-02;4 - FALSE
如果该数字包含未解决的内容,则应引发异常。我写了这个方法,但由于某种原因它不能正常工作。请解释我在使用 match() 时出错的地方
我将不胜感激您的帮助!
public void validatePhoneNumber(String phoneNumber) {
if (!phoneNumber.matches("[ˆ0-9()\\-+]")) {
throw new IncorrectlyEnteredDataException("Phone number have unresolved characters");
}
解决方案
此正则表达式适用于您的电话号码:
"^\\+?\\d{3}(?:\\d{11}|(?:-\\d{3,}){3}|(?:-\\(\\d{3,}\\)){3})"
但是,如果您想匹配各种电话号码的变体,请查看此解决方案 - Java 为有效电话号码生成 REGEX:
测试台和上下文中显示的正则表达式:
public class TestBench {
private final static Pattern VALID_PHONE_NUMBER_PATTERN =
Pattern.compile("^\\+?\\d{3}(?:\\d{11}|(?:-\\d{3,}){3}|(?:-\\(\\d{3,}\\)){3})");
public static void main (String[] args) {
List<String> inputNumbers = Arrays.asList(
"+210-998-234-01234", // PASS
"210-998-234-01234", // PASS
"+21099823401234", // PASS
"+210-(998)-(234)-(01234)", // PASS
"+210-99A-234-01234", // FAIL
"+210-999-234-0\"\"234", // FAIL
"+210-999-234-02;4", // FAIL
"-210+998-234-01234", // FAIL
"+210-998)-(234-(01234" // FAIL
);
for (String number : inputNumbers) {
validatePhoneNumber(number);
}
}
private static void validatePhoneNumber(String phoneNumber) {
Matcher matcher = VALID_PHONE_NUMBER_PATTERN.matcher(phoneNumber);
if(matcher.matches()) {
System.out.println("This is a valid phone number: " + matcher.group());
}
}
}
输出:
This is a valid phone number: +210-998-234-01234
This is a valid phone number: 210-998-234-01234
This is a valid phone number: +21099823401234
This is a valid phone number: +210-(998)-(234)-(01234)
评论:
注意:您可以通过更改正则表达式中的 X 和 Y 等来更改可以容忍的数字数量,请参阅下面的说明:
"^\\+?\\d{3}(?:\\d{X}|(?:-\\d{Y,}){3}|(?:-\\(\\d{Y,}\\)){3})"
在建议的正则表达式中,我们假设在另一个变化出现之前总是先有三位数字。