【问题标题】:Retrieving a phone number from a string with regular expressions [duplicate]使用正则表达式从字符串中检索电话号码 [重复]
【发布时间】:2012-10-19 06:29:34
【问题描述】:

可能重复:
Regular Expression for Phone Number

我对正则表达式有点陌生,所以我还不知道它的可能性。所以,不知道这个问题会不会很难解决。

我的电话字符串格式非常宽松,需要以固定的方式对其进行格式化(至少尽力而为)。 "899-123-4-45; 22-56-87", "5 99-25-31-71", “577-345-678,274-89-56”。

这是我知道的信息:

新的固定电话以 2-XX-XX-XX 开头,后跟 6 个数字(它们之间可以是两种分隔符,“-”或“”,其中数字未知)。

旧固定电话仅包含 6 个号码 XX-XX-XX。

旧手机代码包含 8XX-YY-YY-YY 9 个号码。第一个是8。XX是运营商的代码(不知道全部)。

新手机码包含5XX-YY-YY 9个号码,唯一的区别是第一个号码。

有些记录包含旧座机代码、新座机代码、旧手机代码和新手机代码。

我需要以新格式存储所有数字,只有两个分隔符“-”和“,”。 例如:“599-12-34-56,2-45-61-34”、“2-45-65-12”、“574-12-34-56”。

我只是不知道从哪里开始。我是否应该尝试只用包含数字的字符串拆分大字符串,然后只检索数字并确定它是哪种格式?还是有更简单的解决方案?

你会如何解析这个字符串:“574-12-34-56; 2 456 324, 455-566 2 22 40 56”?首先将这些分成3部分?我可以用“;”来分割它吗或“”或“,”?那么我应该只检索数字并确定它们的样式并正确格式化吗?

【问题讨论】:

  • 574-12-34-56; 2 456 324, 455-566 2 22 40 56 这样的字符串可能可以处理..但是如果你有像574-12-34-56; 2 456 324, 455-566 2 22 40 56 2 22 40 56 2 22 40 56 这样的字符串,我认为不会。
  • 我不认为电话号码的正则表达式与这个问题密切相关

标签: javascript regex parsing


【解决方案1】:

(在我看来)最好的解决方案是使用多个正则表达式,每个正则表达式用于不同的格式。正则表达式往往会快速增长,因此维护它们可能会令人生畏。

我会做的是使用这样的东西:

  • (2)[ -]+(\d{2})[ -]+(\d{2})[ -]+(\d{2}) 匹配第一个模式(新固定电话):2-XX-XX-XX
  • (\d{2})[ -]+(\d{2})[ -]+(\d{2}) 匹配第二种模式(旧固定电话):6 位数。
  • (8\d{2})[ -]+(\d{2})[ -]+(\d{2})[ -]+(\d{2})匹配第三种模式(旧手机):8XX-YY-YY-YY
  • (5\d{2})[ -]+(\d{2})[ -]+(\d{2})[ -]+(\d{2})匹配第四种模式(新手机):5XX-YY-YY-YY

您必须使用上述表达式来查看哪个表达式与您输入的数字的格式相匹配。请注意,这些表达式假定构成电话号码的数字由空格 () 或破折号 (-) 分隔。

如果模式匹配,正则表达式引擎也会将组成电话号码的数字分组,用()括号表示。然后,您可以通过访问这些组并创建代表新格式化的电话的新字符串,以任何您希望的方式重建电话号码。

要了解如何在 Javascipt 中使用正则表达式组,请查看 here

【讨论】:

  • 这确实对我熟悉正则表达式有很大帮助。我想我现在知道如何处理这个问题了。谢谢! ;)
  • @SandroDolidze:很高兴它有帮助。
【解决方案2】:

我会建议一种不同的方法:

首先,在分隔电话号码的字符上拆分字符串:

result = subject.split(/[,;]/);

其次,在每个子字符串上,删除所有非数字字符(可能除了+,以便保留有关国际号码的信息):

result[i] = result[i].replace(/[^\d+]+/g, "");

现在你有了所有没有任何分隔符的数字。然后您可以查看这些字符串,将它们分类为不同的类别(移动、固定电话、国际等),或许还可以重新引入您自己的分隔符。如果你愿意的话。

【讨论】:

  • 这种方法似乎也很有趣。我会尝试这两种方法,看看哪一种效果更好。感谢您采用不同的方法;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-04
  • 1970-01-01
  • 1970-01-01
  • 2011-03-21
  • 2014-03-02
  • 1970-01-01
相关资源
最近更新 更多