JavaScript正则表达式:用于美国电话号码

3

你好,我正在尝试编写正则表达式,但遇到了一些问题。有谁能帮我写一个呢。

条件:

• 不允许全部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

与其他问题不同的是,以上问题更侧重于使用正则表达式来满足特定条件。


你能展示一下你试图匹配的格式吗? - Ibu
类似{m,n}这样的量词应该放在它们所量化的表达式之后。 - Mark Reed
@JaromandaX '(367) 123 - 4567'.indexOf('0') // -1 你在这个字符串中看到了哪个0 - Vidul
@Vidul - 示例数字中有10个数字,但不允许全部为0。不一致性与数字0无关,而是与计数到10有关。 - Jaromanda X
@JaromandaX 我猜OP只是脑抽了一下,想说的是10,因为有效的美国电话号码有7个数字用于本地号码 + 3个数字的区号,总共10个数字。 - CrayonViolent
显示剩余6条评论
4个回答

4

首先,我应该指出需要使用美国电话号码格式相当严格,国际电话号码可能有非常不同的规则。尽管如此,以下正则表达式应该满足您的需求:

/(?:^|\D)\(([2-9])(?:\d(?!\1)\d|(?!\1)\d\d)\)\s*[2-9]\d{2}-\d{4}/

首先,为了防止匹配以有效电话号码结尾但前面有额外垃圾的内容,我们匹配字符串的开头(^)或非数字字符(\D)。然后是区号的左括号(\()。
然后我们匹配区号的第一个数字,[2-9]
接下来,我们匹配任意数字\d),后跟除第一个数字外的任何数字(?!\1)\d,或者反过来((?!\1)\d\d)。这样可以避免区号是三个相同的数字。
然后我们关闭括号(\)),在前缀的第一个数字(再次是[2-9])之前允许(但不要求)空格(\s*),后跟任意两个数字(\d{2})、连字符和任意四个数字(\d{4})。

这听起来是我认为正确的解决方案,让我测试一下。感谢您的努力。 - Samir Shah

2

让我们分开来看,您有三个条件:

  1. 不允许全部 9 位数字为 0
  2. 区号(前三位数字)不能是相同的数字,
  3. 第一位和第四位不能为 0 或 1。

如果考虑条件 3,那么条件 1 就是多余的;不考虑条件 2 的简单正则表达式如下:

/^\([2-9]\d\d\) [2-9]\d\d-\d{4}$/

假设您想要括号和空格-(555) 555-5555
解释:
• \d 匹配任何数字 • [2-9] 匹配从 2 到 9 的任何字符 • 空格和破折号是文字-匹配空格和破折号 • {4} 是一个量词-在这种情况下将匹配 4 个数字 • ( 和 ) 是转义文本-将分别匹配 ( 和 )
现在,如果我们要考虑条件 2 在我们的表达式中,我们使用
• 负面向前看 ?! • 捕获组 () 和 • 一个反向引用 \1。
如果您想完全理解这些内容,请阅读一些正则表达式参考。完整的表达式如下:
^\(([2-9])(?!\1\1)\d\d\) [2-9]\d\d-\d{4}$

首先非常感谢您的努力。我可以看到您的解决方案中有适当的逻辑。我会等待完整的答案。再次感谢。 - Samir Shah
我刚刚做了一些更改。现在答案是完整的。 - Pedro Affonso

0
/^\D([2-9])(?!\1\1)\d{2}\D\s+[2-9]\d{2}\s+\W\s+\d{4}$/

0
尝试将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" />


逻辑是正确的,但我更关注正则表达式,如果它能够奏效,我肯定会尝试实现它。感谢您的努力。 - Samir Shah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接