问题是我的客户(我不知道为什么,也许是客户的东西)要添加另一种格式,即连续十个数字,如下所示:1234567890.
我正在使用此正则表达式,
/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/
如何添加它还能验证另一种格式?我对正则表达式不好。
#1 楼
首先,您的格式验证器显然仅适用于NANP(国家代码+1)数字。具有北美以外电话号码的人会使用您的应用程序吗?如果是这样,您就不想阻止这些人输入完全有效的[国际]号。其次,您的验证不正确。 NANP编号采用
NXX NXX XXXX
的形式,其中N
是2-9的数字,而X
是0-9的数字。此外,区号和交换区不能采用N11
的形式(以两个结尾),以避免与特殊服务混淆,但非地理区号(800、888、877、866、855、900)中的数字可能带有N11
交换。因此,即使这不是一个有效的电话号码,您的正则表达式也会通过数字(123)123 4566。您可以通过将
\d{3}
替换为[2-9]{1}\d{2}
来解决此问题。最后,我感觉到您正在验证Web浏览器中的用户输入。请记住,客户端验证只是为用户提供的便利;您仍然需要再次验证服务器上的所有输入。TL; DR不需要使用正则表达式来验证复杂的真实数据,例如电话号码或URL。使用专门的库。
评论
我同意,正则表达式不足以验证电话号码,因为电话号码计划实际上是基于范围(例如12300000至12399999(numberingplans.com/…)
–user591593
2014年8月27日12:14
您的答案是完美的。
–克里斯蒂亚诺·邦巴扎(Cristiano Bombazar)
10月13日14:26
#2 楼
我选择的正则表达式是:/^[\+]?[(]?[0-9]{3}[)]?[-\s\.]?[0-9]{3}[-\s\.]?[0-9]{4,6}$/im
有效格式:
(123)456-7890(123)456-7890123-456-7890123.456 .78901234567890 + 31636363634075-63546725
评论
什么是/ im?在Google上找不到说明:)
– Sarin Suriyakoon
17年7月3日在2:29
@SarinSuriyakoon我使表达式不区分大小写,并且m执行多行搜索
–罗德里戈·莱特(Rodrigo Leite)
17年8月3日在15:20
为什么您需要数字不区分大小写?
–所罗门·克洛森(Solomon Closson)
18-2-27在19:03
此正则表达式非常有用,因为如果删除开头的^和$的末尾,它也可以在字符串的中间找到电话号码
–hobberwickey
19 Mar 8 '19 at 17:14
@darioxlz'123456789'不是电话号码的有效长度
–punjabi4life
1月21日22:53
#3 楼
如果只寻找10位数字,请忽略除数字以外的所有内容- return value.match(/\d/g).length===10;
评论
这就是我要建议的。轻松活泼的。无论如何,过多的验证可能是一件坏事。
– mwilcox
2010-12-22 22:25
这是最好的方法。除非您真的很在意它的格式,否则所有操作都是确保该数字部分有效,而不是一堆乱码。
–mdance
2012年11月29日23:14
您的意思是match(/ \ d / g)不匹配(/ \ d /),否则长度为1,而不是10;同样,在空字符串上的匹配为null。至少应该是var m = value.match(/ \ d / g);返回m && m.length === 10
–道格
2014-09-22 7:08
或者返回(value.match(/ \ d / g)|| [])。length == 10或更简单(但同样有缺陷):return value.replace(/ \ D / g,'')。length = = 10。
–RobG
16-8-23在5:56
我喜欢这个:/ \ D / gi.test(值)。不是数字的所有内容,包括空格,破折号等。
– Gus
19年7月4日在1:59
#4 楼
/^[+]*[(]{0,1}[0-9]{1,3}[)]{0,1}[-\s\./0-9]*$/g
(123)456-7890
+(123)456-7890
+(123)-456-7890
+(123) -456-7890
+(123)-456-78-90
123-456-7890
123.456.7890
1234567890
+31636363634
075 -63546725
这是一个非常宽松的选项,我更喜欢保留这种方式,主要是在需要用户添加电话号码的注册表中使用它。
通常,用户在使用强制执行严格格式规则的表单时会遇到麻烦,我更希望用户在显示屏中或在将其保存到数据库之前填写数字及其格式。
http://regexr.com/3c53v
评论
正则表达式略有修改以允许例如for +41(79)123 45 67(瑞士):/ ^ [+]?[\ s./0-9] * [(]?[0-9] {1,4} [)]?[-\ s./0-9]*$/g
– Remigius Stalder
18年7月26日在11:05
该代码似乎不太适合我,因为它不太字符串,并且似乎涵盖了所有国际格式(并感谢@RemigiusStalder的瑞士修复程序)
–加文
18年8月31日在12:26
如果您有Java后端,则可以添加电话号码规范化功能,例如来自github.com/google/libphonenumber
– Remigius Stalder
19-10-24在16:02
#5 楼
我要做的是忽略格式并验证数字内容:var originalPhoneNumber = "415-555-1212";
function isValid(p) {
var phoneRe = /^[2-9]\d{2}[2-9]\d{2}\d{4}$/;
var digits = p.replace(/\D/g, "");
return phoneRe.test(digits);
}
评论
同意忽略格式,例如对于移动电话号码,通常使用XXXX XXX XXX之类的空格来表示,但对于要求输入无空格的表格(即XXXXXXXXXX),则是很常见的。
–RobG
18年1月5日在6:28
#6 楼
以下REGEX将验证以下任何一种格式:(123)456-7890
123-456-7890
1234567890
/^[(]{0,1}[0-9]{3}[)]{0,1}[-\s\.]{0,1}[0-9]{3}[-\s\.]{0,1}[0-9]{4}$/
评论
您需要逃脱。否则它将匹配任意字符,从而破坏您的正则表达式。
– Christophh
13年3月12日在10:25
这使我朝着正确的方向前进。谢谢!不幸的是,该表达式也将匹配(1234567890和123)4567890。 ^(((([0-9] {3}))|([0-9] {3}))[-\ s \。]?[0-9] {3} [-\ s \。]? [0-9] {4} $解决了这个小问题。
–乔·霍金斯(Joe Hawkins)
15年6月26日在20:52
#7 楼
其中str可能是以下任何一个实体商店:555-555-5555
(555)555-5555
(555)555-5555
1 555 555 5555
function telephoneCheck(str) {
var isphone = /^(1\s|1|)?((\(\d{3}\))|\d{3})(\-|\s)?(\d{3})(\-|\s)?(\d{4})$/.test(str);
alert(isphone);
}
telephoneCheck("1 555 555 5555");
评论
好的正则表达式,多数民众赞成在这个问题上的最佳答案
– JoelBonetR
3月30日13:31
#8 楼
我建议使用更清晰的方法(尤其是考虑谁必须维护代码)...怎么办:var formats = "(999)999-9999|999-999-9999|9999999999";
var r = RegExp("^(" +
formats
.replace(/([\(\)])/g, "\")
.replace(/9/g,"\d") +
")$");
regexp是从一个清晰的模板构建的?这样一来,添加新产品就变得轻而易举了,甚至客户本身也可以在“选项”页面中做到这一点。
#9 楼
试试这个-它也包括国际格式的验证。/^[+]?(1\-|1\s|1|\d{3}\-|\d{3}\s|)?((\(\d{3}\))|\d{3})(\-|\s)?(\d{3})(\-|\s)?(\d{4})$/g
此正则表达式验证以下格式:
(541 )754-3010国内电话
+ 1-541-754-3010国际电话
1-541-754-3010在美国拨打电话
001-541-754-3010从德国拨打电话
191 541 754 3010从法国拨打
#10 楼
这将起作用:/^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/
?
字符表示前一组应匹配零或一次。组(-|\s)
将匹配-
或|
字符。在您的正则表达式中第二次出现此组后添加?
,可以匹配10个连续数字的序列。 #11 楼
/^\+?1?\s*?\(?\d{3}(?:\)|[-|\s])?\s*?\d{3}[-|\s]?\d{4}$/
尽管这篇文章很老,但想离开我的贡献。
这些被接受了:
555-555-5555
(555 )555-5555
1(555)555-5555
1 555 555 5555
1 555-555-5555
1(555)555-5555
不接受这些:
接受此使用:
^\+?1?\s*?\(?(\d{3})?(?:\)|[-|\s])?\s*?\d{3}[-|\s]?\d{4}$
接受此使用:
^\+?1?\s*?\(?(\d{3})?(?:\)|[-|\s])?\s*?\d{3}[-|\s]?\d{4}$
1 555)555-5555
123 **&!! asdf#
55555555
(6505552368)
2(757)622-7382
0(757) 622-7382
-1(757)622-7382
2 757 622-7382
10(757)622-7382
27576227382
(275)76227382
2(757)6227382
2(757)622-7382
(555)5(55?)-5555
这是我使用的代码:
function telephoneCheck(str) {
var patt = new RegExp(/^\+?1?\s*?\(?\d{3}(?:\)|[-|\s])?\s*?\d{3}[-|\s]?\d{4}$/);
return patt.test(str);
}
telephoneCheck("+1 555-555-5555");
评论
此正则表达式的唯一问题是,它认为只有一个')'或只有一个'('的电话字符串有效(例如“(555-555-5555“))
–happyZZR1400
2月17日21:25
#12 楼
非常简单"9001234567".match(/^\d{10}$/g)
#13 楼
试试这个/^(\+{0,})(\d{0,})([(]{1}\d{1,3}[)]{0,}){0,}(\s?\d+|\+\d{2,3}\s{1}\d+|\d+){1}[\s|-]?\d+([\s|-]?\d+){1,2}(\s){0,}$/gm
有效格式
(123)456-7890
(123)456-7890 < br 123-456-7890
1234567890
+31636363634
+3(123)123-12-12
+3(123)123-12-12
+3(123)1231212
+3(123)12312123
+3(123)123 12 12
075-63546725
+7910 120 54 54
899999999 99
https://regex101.com/r/QXAhGV/1
评论
{1}没有用,{0,}最好写成*。为什么要使用所有这些捕获组?他们减慢了进程。
–多多
19年11月29日在12:58
不是很好。因为您可以根据需要输入许多数字。
–穆罕默德·贾瓦德·巴拉蒂
4月11日10:58
#14 楼
每个人的答案都很棒,但是我认为这是一个更全面的答案。这是为单行中的单个数字的javascript匹配而编写的:
^(?!.*911.*\d{4})((\+?1[\/ ]?)?(?![\(\. -]?555.*)\( ?[2-9][0-9]{2} ?\) ?|(\+?1[\.\/ -])?[2-9][0-9]{2}[\.\/ -]?)(?!555.?01..)([2-9][0-9]{2})[\.\/ -]?([0-9]{4})$
如果要在单词边界处进行匹配,只需将^和$更改为\ b
,我欢迎对此解决方案提出任何建议,更正或批评。据我所知,这与NANP格式匹配(适用于美国编号-创建此代码时我未验证其他北美国家/地区),避免了任何911错误(不能在区号或区域代码中),消除了仅那些实际上无效的555数字(区域代码555,后跟01xx,其中x =任何数字)。
#15 楼
此正则表达式适用于国际电话号码和多种格式的移动电话号码。以下是正则表达式:
/ ^(+ {1} \ d {2,3} \ s?[(] {1} \ d {1,3} [)] {1} \ s?\ d + | + \ d {2,3} \ s {1} \ d + | \ d +){1} [ \ s |-]?\ d +([\ s |-]?\ d +){1,2} $ /
这是JavaScript函数
function isValidPhone(phoneNumber) {
var found = phoneNumber.search(/^(\+{1}\d{2,3}\s?[(]{1}\d{1,3}[)]{1}\s?\d+|\+\d{2,3}\s{1}\d+|\d+){1}[\s|-]?\d+([\s|-]?\d+){1,2}$/);
if(found > -1) {
return true;
}
else {
return false;
}
}
这将验证以下格式:
+44 07988-825 465(使用连字符代替空格的任何组合,但只有空格必须跟随+44)
+44(0)7988-825 465(使用连字符的任何组合来代替空格,除了在(0)之前或之后不能直接存在连字符,并且在(0)之前或之后的空格不需要存在)
123 456-789 0123(使用连字符的任何组合代替空格)
12 123456(可以用连字符代替空格)
1234567890
不能为所有人都存在双空格或双连字符格式。
#16 楼
/^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/
?
字符表示前一组应匹配零或一次。组(-|\s)
将匹配-
或|
字符。 #17 楼
我必须同意验证电话号码是一项艰巨的任务。对于这个特定的问题,我会将正则表达式从
/^(()?\d{3}())?(-|\s)?\d{3}(-|\s)\d{4}$/
更改为
/^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/
最后一个破折号/空格是唯一不必要的一个元素。
评论
我真的在尝试升级Regex游戏!我正在使用“ The Regex Coach”检查您的建议。我正在使用正则表达式(()?\ d {3}())?(-| \ s)?\ d {3}(-| \ s)?\ d {4}和目标字符串(123) 456-7890,但由于某种原因,它只能获取最后7位数字。有任何想法吗?
–亚伦·海瑟薇(Aaron Hathaway)
2010-12-02 18:17
是的正则表达式在大脑上有点粗糙...耐心。可以尝试/ ^ [(]?(\ d {3})[)]?[-| \ s]?(\ d {3})[-| \ s]?(\ d {4})$ /较旧的正则表达式的第一部分效果不佳:“(()?\ d {3}())”(()中间的括号实际上被视为正则表达式语法的一部分,而不是要查找的字符。
–吕克·维罗瑙(Luc Veronneau)
2010年12月2日在18:27
#18 楼
如果您在输入标签上使用,则此代码将对您有所帮助。我自己编写此代码,我认为这是在输入中使用的很好方法。但您可以使用自己的格式进行更改。这将帮助用户在输入标签上更正其格式。$("#phone").on('input', function() { //this is use for every time input change.
var inputValue = getInputValue(); //get value from input and make it usefull number
var length = inputValue.length; //get lenth of input
if (inputValue < 1000)
{
inputValue = '1('+inputValue;
}else if (inputValue < 1000000)
{
inputValue = '1('+ inputValue.substring(0, 3) + ')' + inputValue.substring(3, length);
}else if (inputValue < 10000000000)
{
inputValue = '1('+ inputValue.substring(0, 3) + ')' + inputValue.substring(3, 6) + '-' + inputValue.substring(6, length);
}else
{
inputValue = '1('+ inputValue.substring(0, 3) + ')' + inputValue.substring(3, 6) + '-' + inputValue.substring(6, 10);
}
$("#phone").val(inputValue); //correct value entered to your input.
inputValue = getInputValue();//get value again, becuase it changed, this one using for changing color of input border
if ((inputValue > 2000000000) && (inputValue < 9999999999))
{
$("#phone").css("border","black solid 1px");//if it is valid phone number than border will be black.
}else
{
$("#phone").css("border","red solid 1px");//if it is invalid phone number than border will be red.
}
});
function getInputValue() {
var inputValue = $("#phone").val().replace(/\D/g,''); //remove all non numeric character
if (inputValue.charAt(0) == 1) // if first character is 1 than remove it.
{
var inputValue = inputValue.substring(1, inputValue.length);
}
return inputValue;
}
#19 楼
只是想添加专门用于选择非本地电话号码(800和900类型)的解决方案。(\+?1[-.(\s]?|\()?(900|8(0|4|5|6|7|8)+)[)\s]?[-.\s]?\d{3}[-.\s]?\d{4}
#20 楼
尝试此js函数。如果匹配则返回true,如果失败则返回false
Ref
function ValidatePhoneNumber(phone) {
return /^\+?([0-9]{2})\)?[-. ]?([0-9]{4})[-. ]?([0-9]{4})$/.test(phone);
}
#21 楼
验证电话号码+返回格式化的数据 function validTel(str){
str = str.replace(/[^0-9]/g, '');
var l = str.length;
if(l<10) return ['error', 'Tel number length < 10'];
var tel = '', num = str.substr(-7),
code = str.substr(-10, 3),
coCode = '';
if(l>10) {
coCode = '+' + str.substr(0, (l-10) );
}
tel = coCode +' ('+ code +') '+ num;
return ['succes', tel];
}
console.log(validTel('+1 [223] 123.45.67'));
#22 楼
此功能对我们有效: let isPhoneNumber = input => {
try {
let ISD_CODES = [93, 355, 213, 1684, 376, 244, 1264, 672, 1268, 54, 374, 297, 61, 43, 994, 1242, 973, 880, 1246, 375, 32, 501, 229, 1441, 975, 591, 387, 267, 55, 246, 1284, 673, 359, 226, 257, 855, 237, 1, 238, 1345, 236, 235, 56, 86, 61, 61, 57, 269, 682, 506, 385, 53, 599, 357, 420, 243, 45, 253, 1767, 1809, 1829, 1849, 670, 593, 20, 503, 240, 291, 372, 251, 500, 298, 679, 358, 33, 689, 241, 220, 995, 49, 233, 350, 30, 299, 1473, 1671, 502, 441481, 224, 245, 592, 509, 504, 852, 36, 354, 91, 62, 98, 964, 353, 441624, 972, 39, 225, 1876, 81, 441534, 962, 7, 254, 686, 383, 965, 996, 856, 371, 961, 266, 231, 218, 423, 370, 352, 853, 389, 261, 265, 60, 960, 223, 356, 692, 222, 230, 262, 52, 691, 373, 377, 976, 382, 1664, 212, 258, 95, 264, 674, 977, 31, 599, 687, 64, 505, 227, 234, 683, 850, 1670, 47, 968, 92, 680, 970, 507, 675, 595, 51, 63, 64, 48, 351, 1787, 1939, 974, 242, 262, 40, 7, 250, 590, 290, 1869, 1758, 590, 508, 1784, 685, 378, 239, 966, 221, 381, 248, 232, 65, 1721, 421, 386, 677, 252, 27, 82, 211, 34, 94, 249, 597, 47, 268, 46, 41, 963, 886, 992, 255, 66, 228, 690, 676, 1868, 216, 90, 993, 1649, 688, 1340, 256, 380, 971, 44, 1, 598, 998, 678, 379, 58, 84, 681, 212, 967, 260, 263],
//extract numbers from string
thenum = input.match(/[0-9]+/g).join(""),
totalnums = thenum.length,
last10Digits = parseInt(thenum) % 10000000000,
ISDcode = thenum.substring(0, totalnums - 10);
//phone numbers are generally of 8 to 16 digits
if (totalnums >= 8 && totalnums <= 16) {
if (ISDcode) {
if (ISD_CODES.includes(parseInt(ISDcode))) {
return true;
} else {
return false;
}
} else {
return true;
}
}
} catch (e) {}
return false;
}
console.log(isPhoneNumber('91-9883208806'));
#23 楼
简单的正则表达式:/\b\d{3}[-.]?\d{3}[-.]?\d{4}\b/g
检查格式,希望它能起作用:
f:246.555.8888
m:1235554567
评论
请格式化您的答案(使用四个空格作为代码块的缩进)。对您的代码进行说明也将提高其质量。
– Nander Speerstra
17年4月4日在13:28
#24 楼
\(?\d{3}\)?([\-\s\.])?\d{3}?\d{4}
这将验证任何可变格式的电话号码:
\(?\d{3}\)?
查找是否用括号括起来的3位数字。是否使用分隔符([\-\s\.])?
找到3位数字\d{3}
使用第一个匹配的分隔符-这样可确保分隔符相同。因此(000)999-5555在此处将不会验证,因为存在空格和破折号分隔符,因此只需删除“ \ 1”并替换为分隔符子模式(这样做还将验证非标准格式)。但是无论如何,您都应该为用户输入提供格式提示。
找到4位数字验证:
(000)999 5555
(000)-999-5555
(000).999.5555
(000)999-5555
(000)9995555
000 999 5555
000.999.5555
0009995555
顺便说一句,这适用于JavaScript,因此可以使转义次数加倍。
#25 楼
只是忽略数字以外的所有内容。这里是我使用的:
// USA phones should contain at least 10 digits. For Ukrainian phones it's OK to have only 9 digits, without leading 0 and country code prefix: [+380] 88 888-88-88.
String.prototype.isValidPhone = function(digitsCount) {
var str = this.trim().match(/\d/g);
return str && str.length >= (digitsCount || 10); // default is at least 10 digits
}
#26 楼
试试这个/^[\+]?\d{2,}?[(]?\d{2,}[)]?[-\s\.]?\d{2,}?[-\s\.]?\d{2,}[-\s\.]?\d{0,9}$/im
有效格式:
(123)456-7890
(123)456-7890
123-456-7890
123.456.7890
1234567890
+31636363634
+3(123)123-12-12
+3(123) 123-12-12
+3(123)1231212
+3(123)12312123
075-63546725
评论
请确保在回答中包含解释。尽管可能有效,但重要的是要解释如何以及为什么获得完整且相关的信息。谢谢回答 :)
– Magix
19年3月29日在21:08
评论
用于电话号码验证的综合正则表达式的可能副本根据经验,尝试验证电话号码注定会失败。在不同国家和地区具有不同结构的东西,这是一个非常困难的问题。
那例如法国符号? “ 12 34 56 78 90”只需删除数字以外的所有内容(除了开头可能有加号),然后检查其长度。
实际上,您不应该使用正则表达式正确地验证电话号码。