Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何最好地使用Java部分验证电话号码_Java_Regex_Validation - Fatal编程技术网

如何最好地使用Java部分验证电话号码

如何最好地使用Java部分验证电话号码,java,regex,validation,Java,Regex,Validation,我需要验证电话号码的开头,我的意思是我需要确保提供了国家代码。电话号码应以加号开头,后跟至少1个号码,最多3个号码,后跟连字符 有效数字的示例 +1-555-5555 +12-55555 +123-(555)555-5555 无效电话号码的示例 +1(555)555-5555 55555555 +55555555 这就是我目前所拥有的。我正在做的是剥离所有非数字,以验证我至少有10个数字。然后,我验证我的国家/地区代码至少为3个数字。之后,如果电话号码不是以“+”开头,我会先加一个 privat

我需要验证电话号码的开头,我的意思是我需要确保提供了国家代码。电话号码应以加号开头,后跟至少1个号码,最多3个号码,后跟连字符

有效数字的示例

+1-555-5555

+12-55555

+123-(555)555-5555

无效电话号码的示例

+1(555)555-5555

55555555

+55555555

这就是我目前所拥有的。我正在做的是剥离所有非数字,以验证我至少有10个数字。然后,我验证我的国家/地区代码至少为3个数字。之后,如果电话号码不是以“+”开头,我会先加一个

private boolean isPhoneNumberValid(String phoneNumber) {
  if (!isPhoneNumberLengthValid(phoneNumber) || !isCountryCodeLenghtValid(phoneNumber)) {
    return false;
  }

  if (!phoneNumber.startsWith("+")) {
    request.getDestination().setMobilePhoneNumber("+" + phoneNumber);
  }

  return true;
}

private boolean isPhoneNumberLengthValid(String phoneNumber) {
  return phoneNumber.replaceAll("\\D+","").length() < 10;
}

private boolean isCountryCodeLenghtValid(String phoneNumber) {
  String countryCode = StringUtils.left(phoneNumber, phoneNumber.indexOf("-")).replaceAll("\\D+","");

  return countryCode.length() >= 1 && countryCode.length() <= 3;
}
专用布尔值isPhoneNumberValid(字符串phoneNumber){
如果(!isPhoneNumberLengthValid(电话号码)| |!isCountryCodeLengthValid(电话号码)){
返回false;
}
如果(!phoneNumber.startsWith(“+”)){
request.getDestination().setMobilePhoneNumber(“+”+phoneNumber);
}
返回true;
}
专用布尔值isPhoneNumberLengthValid(字符串phoneNumber){
返回phoneNumber.replaceAll(“\\D+”,”).length()<10;
}
私有布尔值isCountryCodeLenghtValid(字符串phoneNumber){
字符串countryCode=StringUtils.left(phoneNumber,phoneNumber.indexOf(“-”).replaceAll(“\\D+”,”);

return countryCode.length()>=1&&countryCode.length()首先,我必须说,要求电话号码符合特定的格式和长度通常不是一个好主意,因为这样会使很多有效号码无效,但我不知道您的使用情况

尽管我会使用正则表达式:

\+\d{1,3}-[()\d\s-]+
此正则表达式匹配具有

  • 字面上的加号
  • 后跟1-3位数字
  • 然后是连字符
  • 然后是括号、数字、空格或连字符集中的一个或多个字符
最后一个类别可以根据您的具体规格进行更改


导入java.util.regex.Pattern;
类电话号码{
受保护的静态无效检查编号(字符串编号){
System.out.println(数字+“:”+(
Pattern.matches(“\\+\\d{1,3}[-][()\\d\\s-]+”,数字)
?“有效”:“无效”
)
);
}
公共静态void main(字符串[]args){
字符串编号;
支票号码(“+1-555-5555”);
支票号码(“+12-555”);
支票号码(“+123-(555)555-5555”);
支票号码(“+1(555)555-5555”);
支票号码(“5555”);
支票号码(“+5555”);
}
}
这将产生:

+1-555-5555 : valid
+12-5555555 : valid
+123-(555) 555-5555 : valid
+1(555) 555-5555 : invalid
5555555555 : invalid
+5555555555 : invalid
试试这个

  • +
  • 然后是
    1-3位数
  • 然后是
    -
  • 后跟
    任何内容

对于您的示例电话号码,您可以使用可选组来匹配括号之间的数字,并使连字符可选

^\+\d{1,3}-(?:\(\d{3}\)\h*)?\d{3}-?\d{4}$
解释

  • ^
    字符串的开头
  • \+\d{1,3}-
  • (?:
    非捕获组
    • \(\d{3}\)\h*
      匹配
      ,3位,
      和0+水平空白字符
  • )?
    关闭组并将其设置为可选
  • \d{3}-?\d{4}
    匹配3位数字,可选的
    -
    和4位数字
  • $
    字符串结尾
|

在爪哇

String regex = "^\\+\\d{1,3}-(?:\\(\\d{3}\\)\\h*)?\\d{3}-?\\d{4}$";
比如说

String strs[] = { 
        "+1-555-5555",
        "+12-5555555",
        "+123-(555) 555-5555",
        "+1(555) 555-5555",
        "5555555555",
        "+5555555555",
        "+123-)(----"
    };
String regex = "\\+\\d{1,3}-(?:\\(\\d{3}\\)\\h*)?\\d{3}-?\\d{4}";
for (String s : strs)
    System.out.printf("%s --> %s%n", s, s.matches(regex) ? "Match" : "No match");
输出

+1-555-5555 --> Match
+12-5555555 --> Match
+123-(555) 555-5555 --> Match
+1(555) 555-5555 --> No match
5555555555 --> No match
+5555555555 --> No match
+123-)(---- --> No match

您可以使用下面给出的解决方案中提到的正则表达式:

public class Main {
    public static void main(String[] args) {
        String[] phoneNumbers = { "+1-555-5555", "+12-5555555", "+123-(555) 555-5555", "+1(555) 555-5555", "5555555555",
                "+5555555555" };
        for (String phoneNumber : phoneNumbers) {
            if (phoneNumber.matches("^[+][0-9]{1,3}[-][[(]{0,1}[0-9]+[-)\\s]{0,1}]*[0-9]{4}$")) {
                System.out.println(phoneNumber + " passed validation");
            } else {
                System.out.println(phoneNumber + " failed validation");
            }
        }
    }
}
输出:

+1-555-5555 passed validation
+12-5555555 passed validation
+123-(555) 555-5555 passed validation
+1(555) 555-5555 failed validation
5555555555 failed validation
+5555555555 failed validation

举个例子,你的正则表达式应该是这样的:+\d\d?\d?\-[0-9()\-]+这是用户提供的数据吗?如果是这样的话,最好在你的电话字段中实现一个掩码。谢谢大家!
+1-555-5555 passed validation
+12-5555555 passed validation
+123-(555) 555-5555 passed validation
+1(555) 555-5555 failed validation
5555555555 failed validation
+5555555555 failed validation