关于正则表达式:正则表达式用于查找电话号码

Regular Expression for finding phone numbers

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicates:
A comprehensive regex for phone number validation
grep with regex for phone number

大家好,

我是Stackoverflow的新手,我有一个简单的问题。 让我们假设我们获得了大量的HTML文件(理论上无限大)。 如何使用正则表达式从所有这些文件中提取电话号码列表?

解释/表达将非常感激。 电话号码可以是以下任何格式:

  • (123)456 7899
  • (123).456.7899
  • (123)-456-7899
  • 123-456-7899
  • 123 456 7899
  • 1234567899

非常感谢您的帮助并拥有一个好的帮助!


/^[\.-)( ]*([0-9]{3})[\.-)( ]*([0-9]{3})[\.-)( ]*([0-9]{4})$/

应该完成你想要做的事情。

第一部分^表示"行的开头",它将强制它考虑整个字符串。

我在那里的[\.-)( ]*表示"任何句号,连字符,括号或空格出现0次或更多次"。

([0-9]{3})群集匹配一组3个数字(最后一个设置为匹配4)

希望有所帮助!


在不知道您正在使用什么语言的情况下,我不确定语法是否正确。

这应该与您的所有组匹配,误报率很低:

1
/\(?([0-9]{3})\)?([ .-]?)([0-9]{3})\2([0-9]{4})/

匹配后您将感兴趣的组是组1,3和4.组2仅用于确保第一个和第二个分隔符.-相同。

例如,用于剥离字符并在123456789中保留电话号码的sed命令:

1
sed"s/(\{0,1\}\([0-9]\{3\}\))\{0,1\}\([ .-]\{0,1\}\)\([0-9]\{3\}\)\2\([0-9]\{4\}\)/\1\3\4/"

以下是我表达的误报:

  • (123)456789
  • (123456789
  • (123 456 789
  • (123.456.789
  • (123-456-789
  • 123)456789
  • 123)456 789
  • 123).456.789
  • 123)-456-789

将表达式分为两部分,一部分与括号匹配,另一部分不匹配将消除所有这些误报,除了第一部分:

1
/\(([0-9]{3})\)([ .-]?)([0-9]{3})\2([0-9]{4})|([0-9]{3})([ .-]?)([0-9]{3})\5([0-9]{4})/

在这种情况下,第1,3和4组或第5,7和8组都很重要。


^(\(?\d{3}\)?)([ .-])(\d{3})([ .-])(\d{4})$

除最后一个模式外,这应匹配所有模式。
对于最后一个,您可以使用分离的模式^\d{10}$

并且有一个错误,它将匹配(123 456 7899

  • ^(\(?\d{3}\)?),如果我们破坏此代码,则第一个字符(^)与文本的开头匹配。 \(?\)?会接受或不接受此字符,有问题需要检查是否有开口字符,如果第二个必须匹配,我不知道是否可能仅使用Regex。并且\d{3}将匹配三个数字

  • ([ .-])将匹配其中任何一个,但只有一个且仅一次。

  • (\d{3})将匹配三个数字

  • 与2相同

  • (\d{4})$四个数字后跟文本末尾($)

  • 由于您要从HTML页面中提取,您必须忽略^$以匹配文本的任何部分,并在javascript / exp / g中设置标志global

    你可以在这里测试Regex


    这将帮助您捕获括号中区号的那些

    1
    ([0-9]\{3\})[ .-][0-9]\{3\}[ .-][0-9]\{4\}

    其他人是:

    1
    2
    [0-9]\{3\}[ -][0-9]\{3\}[ -][0-9]\{4\}
    [0-9]\{10\}

    我将第一个和第二个分开,因为将它们放在一起而不回溯可能会让你接受(123 456 7890123) 456 7890

    另请注意,在我的终端上使用grep,我不得不逃避{ }重复。您可能没有,或者您可能必须逃避其他角色,具体取决于您打算使用它的位置。