基本的美国手机正则表达没有拿起区号

时间:2016-02-24 00:42:32

标签: regex

我使用此正则表达式(\([0-9]\)\s)?([0-9]{3})([\s-])([0-9]{4})来查找4种基本电话格式。

555-1234

555 1234

(414)555-1234

(414)555 1234

找不到括号中带区号的电话号码

2 个答案:

答案 0 :(得分:2)

您的要求毫无意义。这些都是有效的美国电话号码

1234567
123 4567
123-4567
123 - 4567
123 456 7890
123.456.7890
(123) 4567890
+1 (123) 456-7890
+1 123-456-7890

无数其他排列。

不要对用户的脖子感到痛苦。编写友好的正则表达式

/^(?:\+1\s*)?(?:(?:\(\d{3}\)|\d{3})\s*[.-]?\s*)?\d{3}\s*[.-]?\s*\d{4}$/

regexp visualization

这允许:

  • 可选的领先地区代码+1(北美)
  • 可选空格,.-或其组合,可用作分隔符
  • 可选区号
  • ()
  • 中包含的可选区号

如果您想接受各种各样的用户输入,但是在系统中以统一格式存储它们,那也很容易。在regexp中使用捕获组来提取相关的数字。

/^(?:\+1\s*)?(?:(?:\((\d{3})\)|(\d{3}))\s*[.-]?\s*)?(\d{3})\s*[.-]?\s*(\d{4})$/

要创建捕获组,您可以使用()。请注意\d{3}\d{4}附近使用捕获组。

现在在我们的代码中,我们可以使用捕获组。此示例代码使用JavaScript

const truthy = x => !!x;

const formatPhoneNumber = n => {
  // regexp that we made above
  let re = /^(?:\+1\s*)?(?:(?:\((\d{3})\)|(\d{3}))\s*[.-]?\s*)?(\d{3})\s*[.-]?\s*(\d{4})$/;
  // destructure the capture groups
  let [match, area1, area2, part1, part2] = re.exec(n);
  // reassemble the parts as desired
  return [area1 || area2, part1, part2].filter(truthy).join('-')
}

现在让我们定义我们的示例数据并查看每个数字的格式化

let xs = [
  '1234567',
  '123 4567',
  '123-4567',
  '123 - 4567',
  '123 456 7890',
  '123.456.7890',
  '(123) 4567890',
  '+1 (123) 456-7890',
  '+1 123-456-7890',
];

xs.map(formatPhoneNumber);

请注意,每个电话号码输入有很大差异,但输出 100%统一

[
    "123-4567",
    "123-4567",
    "123-4567",
    "123-4567",
    "123-456-7890",
    "123-456-7890",
    "123-456-7890",
    "123-456-7890",
    "123-456-7890"
]

答案 1 :(得分:0)

这有效:

/(\([\s\d]+\)\s*)?\d+[\s\-]*\d+/g