有效的正则表达式?

时间:2016-11-11 16:54:38

标签: java regex

我有这个字符串:

  

+1(333)456-7890

我希望将它与正则表达式匹配。这就是我现在的正则表达式:

Pattern p1 = Pattern.compile("((\\+{0,}[0-9]{0,3}( |-)?)?)(\\(?[0-9]    
 {3}\\)?|[0-9]{3}( |-)?)([0-9]{3}( |-)?)([0-9]{4}|[a-zA-Z0-9]{7})");

应该识别中间有潜在破折号或空格的任何电话号码模式,可能是至少10位数(或字母),没有国家代码,最多13位数字带国家代码。

我的模式似乎与某些案例相匹配,而不是像之前所说的那样。我真的很难过,任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:2)

你的正则表达式似乎过于复杂,这就是为什么它可能会在某个地方出现故障。我试图遵循它,但最后更容易阅读你的定义并从头开始构建一个新定义:

(\+\d{1,3}[- ]*)?(\(?\d\d\d\)?)[- ]*(\d\d\d[- ]?\d\d\d\d|[a-zA-Z0-9]{7})

这符合以下测试用例:

  

+1(333)456-7890

     

+ 1-(212)555-0198

     

+1 212 555-0198

     

+1 212-ILOVEUU

根据您自己的测试用例,这可能就足够了。或者不是。

(\+\d{1,3}[- ]*)?     // Optional +xxx international prefix plus dash/space
(\(?\d\d\d\)?)[- ]*   // three-digit area code with optional parens
(\d\d\d[- ]?\d\d\d\d| // Either 7 digits, with optional dash
[a-zA-Z0-9]{7})       // or 7 letters/digits