我试图把一个全面的正则表达式放在一起来验证电话号码。理想情况下,它可以处理国际格式,但它必须处理美国格式,包括以下内容:

1-234-567-8901 1-234-567-8901 x1234 1-234-567-8901 ext1234 1 (234) 567-8901 1.234.567.8901 1/234/567/8901 12345678901

我会用我目前的尝试来回答,但我希望有人有更好的和/或更优雅的东西。


当前回答

对这个话题的大量回复加强了我的直觉——这个问题实际上有无数个解决方案,没有一个是优雅的。

老实说,我建议你不要尝试验证电话号码。即使您可以编写一个允许所有不同合法格式的大型、复杂的验证器,它最终也会允许几乎任何东西,甚至在一开始就允许与电话号码相差甚远的东西。

在我看来,最优雅的解决方案是验证最小长度,仅此而已。

其他回答

.*

如果用户想要给你他们的电话号码,那么相信他们会把它做好。如果他们不想给你,那么强迫他们输入一个有效的数字,要么把他们送到竞争对手的网站,要么让他们输入一个符合你的正则表达式的随机字符串。我甚至可能会忍不住去查询占星热线的电话号码,然后输入这个号码。

我也会考虑以下任何一个网站上的有效条目:

"123 456 7890 until 6pm, then 098 765 4321"  
"123 456 7890 or try my mobile on 098 765 4321"  
"ex-directory - mind your own business"
/\b(\d{3}[^\d]{0,2}\d{3}[^\d]{0,2}\d{4})\b/

虽然它不是正则表达式,但您可以使用Python库DataPrep中的validate_phone()函数来验证美国电话号码。使用pip Install dataprep安装它。

>>> from dataprep.clean import validate_phone
>>> df = pd.DataFrame({'phone': ['1-234-567-8901', '1-234-567-8901 x1234', 
         '1-234-567-8901 ext1234', '1 (234) 567-8901', '1.234.567.8901',
         '1/234/567/8901', 12345678901, '12345678', '123-456-78987']})
>>> validate_phone(df['phone'])
0     True
1     True
2     True
3     True
4     True
5     True
6     True
7    False
8    False
Name: phone, dtype: bool

Find String regex = "^\\+(?:[0 - 9] ?){6、14}[0 - 9]美元”;

对国际号码很有用。

试试这个(用于印度手机号码验证):

if (!phoneNumber.matches("^[6-9]\\d{9}$")) {
  return false;
} else {
  return true;
}