RegExp:使用格式化的号码查找未格式化的电话号码

时间:2015-06-06 21:27:36

标签: javascript regex

如果我有E.164格式化的电话号码,并且我想查找具有该电话号码的任何用户,虽然他们的号码可能没有格式化,那该正则表达式会是什么样的?

示例:

假设:

  

1234567891

正则表达式应匹配以下任何一个:

  

(123)456 7891

     

123-456-7891

     

1234567891

     

123.456.7891

     

1234567891

以上任何一个带有尾随或前导空格的内容。

4 个答案:

答案 0 :(得分:1)

var str = '+1234567891',
    parts = str.match(/\+((\d{3})(\d{3})(\d{4}))/).slice(1),
    num = parts.shift(),
    rg = new RegExp(
      '\\s*(?:\\+?' + [
        num,
        parts.join('.'),
        parts.join('-'),
        '\\(' + parts[0] + '\\) ' + parts.slice(1).join(' ')
      ].join('|') + ')\\s*');

在这种情况下,它会产生

/\s*(?:\+?1234567891|123.456.7891|123-456-7891|\(123\) 456 7891)\s*/

答案 1 :(得分:0)

我认为你能做的最好的事情是将两个数字标准化并比较结果。例如,您可以删除不是数字([^0-9])的所有内容,并仅比较左边的数字。

答案 2 :(得分:0)

您可以使用以下正则表达式:

^\s?(\(\d{3}\)|\+?\d{3})([\s-.])?\d{3}\2\d{4}\s?$

演示:https://www.regex101.com/r/jM2fF4/6

enter image description here

答案 3 :(得分:0)

尝试:

DateTime dt = new DateTime(2015, 6, 3, 23, 0, 0);
Console.WriteLine(dt.ToString("ddd HH:mm", CultureInfo.InvariantCulture)); // Wed 23:00

See the regex101 example

工作原理

  • DateTime dt = new DateTime(2015, 6, 4, 1, 0, 0); Console.WriteLine(dt.ToString("ddd h:mm tt", CultureInfo.InvariantCulture)); // Thu 1:00 AM 匹配任何前面的空格
  • /\s*(\+)?(\(\d{3}\)|\d{3})([ -.]|)\d{3}(\3)\d{4}\s*/ 可选地匹配\s*
  • (\+)?匹配+(\(\d{3}\)|\d{3})
  • (123)匹配123([ -.]|)或任何内容
  • -匹配.
  • \d{3} 123
  • 匹配的内容
  • (\3)匹配( |-|.|)
  • \d{4}匹配以下任何空格