【问题标题】:Regular Expression for finding phone numbers [duplicate]用于查找电话号码的正则表达式 [重复]
【发布时间】:2011-02-20 00:06:07
【问题描述】:

可能的重复:
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

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

【问题讨论】:

  • 代码中能不能有其他不是电话号码而是11位数字的数字串?
  • 不要认为这是一个骗局,但非常接近。
  • 电话分机怎么样? ###-###-#### x####
  • 非美国号码,甚至:+1-xxx-xxx-xxxx 或 001-xxx-xxx-xxxx 呢?
  • 用正则表达式匹配电话号码是什么?每二十分钟有人问这个问题的一些变化

标签: regex phone-number


【解决方案1】:

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

应该完成你正在尝试做的事情。

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

我在其中的[\.-)( ]* 表示“任何句点、连字符、括号或空格出现 0 次或多次”。

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

希望有帮助!

【讨论】:

  • .* 是相当沉重的。您可能会发现很多误报。
  • 除非有人输入额外的数字,否则不会。
  • @web “我想要 100 个盒子,但那家伙给了我 200 个,我不得不为它们支付 1000 美元!”这句话怎么样?另外,由于这是 HTML,您可以获得类似 <div style="width:100px; height:200px; color:#ff0000"> 的内容
  • @Michael Mrozek - 好的,我把它改得更具体了
  • @webdestroya:感谢您的回复,但您不认为此实现也会导致以下错误语法被传递:)123).)456).9999?
【解决方案2】:

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

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

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

【讨论】:

  • 感谢大家的回复,对于重复这个已经存在的问题可能给您带来的不便,我们深表歉意。
  • 这个微小的变化将有助于使用更多电话号码格式 /(?([0-9]{3}))?([ .-]?)([0-9]{3} )([ .-]?)([0-9]{4})/
【解决方案3】:

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

([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 的终端上,我必须转义{ } 才能重复。您可能不必这样做,或者您可能必须转义其他字符,具体取决于您打算在哪里使用它。

【讨论】:

    【解决方案4】:

    ^(\(?\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 页面中提取内容,因此您必须忽略 ^$ 以匹配文本的任何部分并在 javascript /exp/g 中设置标志 global

    你可以test Regex here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-04
      • 1970-01-01
      • 2014-03-02
      • 1970-01-01
      • 2016-03-11
      • 2011-03-21
      • 2013-08-05
      • 1970-01-01
      相关资源
      最近更新 更多