我使用此正则表达式(\([0-9]\)\s)?([0-9]{3})([\s-])([0-9]{4})
来查找4种基本电话格式。
555-1234
555 1234
(414)555-1234
(414)555 1234
找不到括号中带区号的电话号码
答案 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}$/
这允许:
+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