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.mapArray.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 正则表达式:用于美国电话号码的主要内容,如果未能解决你的问题,请参考以下文章

美国电话号码的正则表达式

使用javascript检查美国地址的正则表达式? [复制]

电话号码的 JavaScript 正则表达式不匹配

JavaScript表单通过正则表达式验证电话号码

javascript 电话号码正则表达式

JavaScript 正则