javascript 正则表达式:用于美国电话号码
Posted
技术标签:
【中文标题】javascript 正则表达式:用于美国电话号码【英文标题】:javascript regex : for US phone number 【发布时间】:2015-11-22 14:03:31 【问题描述】:您好,我正在尝试编写正则表达式,但遇到了一些问题。谁能帮我写一个。
条件:
• 不允许所有 10 位为 0。 • 区号(前3位)不能是同一位, • 第 1 位和第 4 位不能是 0 或 1。
/^\(0,1[2-9]1[0-9]2\)1 1[2-9]1[0-9]2-0,1[0-9]0,4$/
示例格式:(234) 567-7890
上述问题与其他问题不同,因为它更关注使用正则表达式满足的特定条件。
【问题讨论】:
你能显示你想匹配的格式吗? 类似:(000) 234 - 5678 应该是无效的。 (367) 123 - 4567 应该是无效的。因为第 4 位是 1,这是不允许的。 像m,n
这样的量词在它们要量化的表达式之后。
A comprehensive regex for phone number validation 的可能重复项
【参考方案1】:
首先,我应该指出,要求使用美国格式的电话号码是非常严格的;国际号码可以有非常不同的规则。也就是说,这个正则表达式应该可以满足您的需求:
/(?:^|\D)\(([2-9])(?:\d(?!\1)\d|(?!\1)\d\d)\)\s*[2-9]\d2-\d4/
首先,为了防止匹配以有效电话号码结尾但前面有多余垃圾的内容,我们匹配字符串的开头 (^
) 或非数字 (\D
)。然后是区号的左括号,(\(
)。
然后我们匹配区号的第一位,[2-9]
。
然后我们匹配任何一个任何数字(\d
)后跟任何数字除了第一个数字((?!\1)\d
),或反过来((?!\1)\d\d
)。这样可以防止区号是三个相同的数字。
然后我们关闭括号(\)
),在前缀的第一个数字(再次为[2-9]
)之前允许(但不要求)空格(\s*
),然后是任意两位数字(@987654332 @)、连字符和任意四位数字 (\d4
)。
【讨论】:
这个声音对我来说是正确的解决方案,让我测试一下。感谢您的努力。【参考方案2】:让我们分部分来,你有三个条件:
-
不允许所有 9 位为 0
区号(前3位)不能同位,
第 1 位和第 4 位不能为 0 或 1。
如果考虑条件 3,则条件 1 是多余的;一个不考虑条件 2 的简单正则表达式是:
/^\([2-9]\d\d\) [2-9]\d\d-\d4$/
假设您想要括号和空格 - (555) 555-5555
解释:
\d 匹配任何数字 [2-9] 匹配从 2 到 9 的任意字符 空格和破折号是文字 - 匹配空格和破折号 4 是一个量词 - 在这种情况下将匹配 4 位数字 ( 和 ) 是转义文字 - 将分别匹配 ( 和 )现在如果我们想在表达式中考虑条件号 2,我们使用
负前瞻?! 一个捕获组()和 反向引用\1。如果您想完全理解这些,请阅读一些正则表达式参考。完整的表达方式是:
^\(([2-9])(?!\1\1)\d\d\) [2-9]\d\d-\d4$
【讨论】:
首先非常感谢您的努力。我可以从您的解决方案中看到正确的逻辑。我将等待完整的答案。再次感谢。 我刚刚做了一些更改。现在答案已经完成了【参考方案3】:/^\D([2-9])(?!\1\1)\d2\D\s+[2-9]\d2\s+\W\s+\d4$/
【讨论】:
【参考方案4】:尝试将input
属性maxlength
设置为10
,利用Array.prototype.map
,Array.prototype.every
/*
• ALL 9 digits being 0 is not allowed.
• The area code (first 3 digits) cannot be the same digit,
• The 1st and 4th digit cannot be 0 or 1.
*/
document.querySelector("input").oninput = function(e)
var vals = this.value.split("");
if (vals.length === 10)
var all = vals.map(Number).every(function(n)
return n === 0
)
, area = vals.map(Number).slice(1, 3).every(function(n)
return n === Number(vals[0]);
)
, numbers = (Number(vals[0]) === (0 || 1)) || (Number(vals[3]) === (0 || 1))
, res = all === area === numbers;
if (!!res)
alert("invalid entry")
else
alert(vals.join(""))
<input type="text" maxlength="10" />
【讨论】:
逻辑是正确的,但我更专注于正则表达式,但如果成功,我绝对可以尝试实现它。感谢您的努力。以上是关于javascript 正则表达式:用于美国电话号码的主要内容,如果未能解决你的问题,请参考以下文章