【问题标题】:Java Regular Expressions to Validate phone numbers用于验证电话号码的 Java 正则表达式
【发布时间】:2017-02-08 04:11:00
【问题描述】:

在下面的代码中,我试图让输出成为电话号码的不同格式,以及它是否有效。除了第 11 行的 Java 正则表达式代码字符串模式之外,我想通了一切。

 import java.util.regex.*;

  public class MatchPhoneNumbers {
   public static void main(String[] args) {           
     String[] testStrings = {               
               /* Following are valid phone number examples */             
              "(123)4567890", "1234567890", "123-456-7890", "(123)456-7890",
              /* Following are invalid phone numbers */ 
              "(1234567890)","123)4567890", "12345678901", "(1)234567890",
              "(123)-4567890", "1", "12-3456-7890", "123-4567", "Hello world"};

             // TODO: Modify the following line. Use your regular expression here
              String pattern = "^/d(?:-/d{3}){3}/d$";    
             // current pattern recognizes any string of digits           
             // Apply regular expression to each test string           
             for(String inputString : testStrings) {
                System.out.print(inputString + ": "); 
                if (inputString.matches(pattern)) {     
                    System.out.println("Valid"); 
                } else {     
                    System.out.println("Invalid"); 
                }
             }
      }
  }

【问题讨论】:

  • 这 4 种是唯一有效的格式吗?除了认为无效?只需为其中每 4 个创建正则表达式,然后
  • 请注意,与数字匹配的原子是\d,而不是/d,如果您在String 文字中,则需要将其写为\\d
  • “123456-7890”是否有效?
  • 这是针对哪个国家/地区的?如果您需要验证国际电话号码,则需要先确定国家代码,然后为每个国家应用多个正则表达式。请记住,在一些国家/地区,手机号码与固定电话的长度不同,并且电话号码布局(空格/破折号所在的位置)多年来发生了变化。 IE。我在西班牙的旧(多年前)电话号码是+34 91 411-6280,但现在它也写成+34 914 116 280。祝你好运。

标签: java regex


【解决方案1】:

基本上,你需要取 3 或 4 种不同的模式,并用“|”将它们组合起来:

String pattern = "\\d{10}|(?:\\d{3}-){2}\\d{4}|\\(\\d{3}\\)\\d{3}-?\\d{4}";
  • \d{10} 匹配 1234567890
  • (?:\d{3}-){2}\d{4} 匹配 123-456-7890
  • \(\d{3}\)\d{3}-?\d{4} 匹配 (123)456-7890 或 (123)4567890

【讨论】:

  • 如果号码包含国家/地区代码,我们如何获得:+91-123-456-7890 OR +911-22228888 我们如何定义找出这些类型的电话号码的模式。
  • @VikasKumarTiwari 你似乎对如何使用这个网站感到困惑。如果您 100% 确定这些数字只会出现在这两种模式中,那么请开始一个新问题,并说明这一点。否则,您应该阅读this more general question 的答案
  • 谢谢@Patrick Parker 我已经完成了。你的回答对我帮助很大。我已经尝试了一些努力,我做到了
【解决方案2】:

国际电话号码正则表达式

String str=  "^\\s?((\\+[1-9]{1,4}[ \\-]*)|(\\([0-9]{2,3}\\)[ \\-]*)|([0-9]{2,4})[ \\-]*)*?[0-9]{3,4}?[ \\-]*[0-9]{3,4}?\\s?";


 if (Pattern.compile(str).matcher(" +33 - 123 456 789 ").matches()) {
        System.out.println("yes");
    } else {
        System.out.println("no");
    } 

【讨论】:

  • 错误的正则表达式。验证 +44+9123700236 为正确数字
【解决方案3】:

考虑到有关电话号码格式的这些事实:-

  1. 国家/地区代码前缀以“+”开头,有 1 到 3 位数字
  2. 号码的最后一部分,也称为订户号码,是所有号码中的 4 位数字
  3. 大多数国家/地区的电话号码在不包括国家/地区代码后都有 10 位数的电话号码。一般的观察结果是,所有国家/地区的电话号码在排除国家/地区代码后都介于 8 到 11 位之间。
String allCountryRegex = "^(\\+\\d{1,3}( )?)?((\\(\\d{1,3}\\))|\\d{1,3})[- .]?\\d{3,4}[- .]?\\d{4}$";

让我们打破正则表达式并理解,

  • ^ 表达式开始
  • (\\+\\d{1,3}( )?)? 是 1 到 3 位数字之间的可选国家/地区代码匹配,前缀为“+”符号,后跟空格或不带空格。
  • ((\\(\\d{1,3}\\))|\\d{1,3} 是 1 到 3 位数字的强制组,带或不带括号,后跟连字符、空格或不带空格。
  • \\d{3,4}[- .]? 是由 3 位或 4 位数字组成的强制组,后跟连字符、空格或无空格
  • \\d{4} 是最后 4 位的必填组
  • $ 表达式结束

此正则表达式模式匹配大多数国家/地区的电话号码格式,包括:-

        String Afghanistan      = "+93 30 539-0605";
        String Australia        = "+61 2 1255-3456";
        String China            = "+86 (20) 1255-3456";
        String Germany          = "+49 351 125-3456";
        String India            = "+91 9876543210";
        String Indonesia        = "+62 21 6539-0605";
        String Iran             = "+98 (515) 539-0605";
        String Italy            = "+39 06 5398-0605";
        String NewZealand       = "+64 3 539-0605";
        String Philippines      = "+63 35 539-0605";
        String Singapore        = "+65 6396 0605";
        String Thailand         = "+66 2 123 4567";
        String UK               = "+44 141 222-3344";
        String USA              = "+1 (212) 555-3456";
        String Vietnam          = "+84 35 539-0605";

来源:https://codingnconcepts.com/java/java-regex-for-phone-number/

【讨论】:

    【解决方案4】:

    您需要的正则表达式是:

    String regEx = "^\\(?(\\d{3})\\)?[- ]?(\\d{3})[- ]?(\\d{4})$";
    

    正则表达式解释:

    ^\\(? - 可以从选项“(”开始

    (\\d{3}) - 后跟 3 位数字

    \\)? - 可能有一个可选的“)”

    [- ]? - 在前 3 位数字或可选的 ) 字符之后可能有一个可选的“-”

    (\\d{3}) - 后跟 3 位数字。

    [- ]? - 数字后可能有另一个可选的“-”

    (\\d{4})$ - 以四位数结尾

    【讨论】:

    • "以下是无效的电话号码... 123)4567890"
    【解决方案5】:

    为括号中的三个数字创建一个非捕获组三个数字(带有可选的破折号)。然后你需要三位数字(带有另一个可选的破折号),然后是四位数字。比如(?:\\(\\d{3}\\)|\\d{3}[-]*)\\d{3}[-]*\\d{4}。您可能会使用Pattern。大家一起喜欢,

    String[] testStrings = {
            /* Following are valid phone number examples */         
            "(123)4567890", "1234567890", "123-456-7890", "(123)456-7890",
            /* Following are invalid phone numbers */
            "(1234567890)","123)4567890", "12345678901", "(1)234567890",
            "(123)-4567890", "1", "12-3456-7890", "123-4567", "Hello world"};
    
    Pattern p = Pattern.compile("(?:\\(\\d{3}\\)|\\d{3}[-]*)\\d{3}[-]*\\d{4}");
    for (String str : testStrings) {
        if (p.matcher(str).matches()) {
            System.out.printf("%s is valid%n", str);
        } else {
            System.out.printf("%s is not valid%n", str);    
        }
    }
    

    【讨论】:

    • 这将接受不在有效列表中的“123456-7890”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 2014-06-25
    相关资源
    最近更新 更多