14

可能的重复:
电话号码验证的综合正则表达式
grep 与电话号码的正则表达式

大家好,

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

解释/表达将不胜感激。电话号码可以是以下任何一种格式:

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

非常感谢您的所有帮助,祝您一切顺利!

4

4 回答 4

7

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

应该完成你想做的事情。

第一部分^表示“行首”,这将迫使它考虑整个字符串。

我在那里的[\.-)( ]*意思是“任何出现0次或多次的句号、连字符、括号或空格”。

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

希望有帮助!

于 2010-05-16T02:03:30.290 回答
3

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

这应该与您的所有组匹配,并且误报很少:

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

比赛后您将感兴趣的组是第 1、3 和 4 组。第 2 组的存在只是为了确保第一个和第二个分隔符.-相同。

例如,一个 sed 命令去除字符并以 123456789 的形式留下电话号码:

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

将表达式分成两部分,一部分与括号匹配,另一部分不匹配,将消除除第一个之外的所有这些误报:

/\(([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 组很重要。

于 2010-05-16T02:35:01.583 回答
1

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

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

其他的是:

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

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

另请注意,在我使用的终端上grep,我不得不转义以{ }进行重复。您可能不必,或者您可能必须转义其他字符,具体取决于您打算在哪里使用它。

于 2010-05-16T02:17:16.483 回答
1

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

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

并且有错误,会匹配(123 456 7899

  1. ^(\(?\d{3}\)?),如果我们打破这段代码,第一个字符 ( ^) 匹配文本的开头。\(?并且\)?会接受或不接受这个字符,有一个问题是你必须检查是否有一个开始字符,如果有第二个必须匹配,我不知道是否可以只使用正则表达式。并且\d{3}会匹配三个数字

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

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

  4. 与 2 相同

  5. (\d{4})$四个数字后跟文本结尾 ( $)

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

你可以在这里测试正则表达式

于 2010-05-16T02:17:52.707 回答