0

可能重复:
电话号码的正则表达式

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

我有非常自由格式化的电话字符串,需要以固定的方式格式化它们(至少尽力而为)。“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部分?我可以用“;”来分割它吗 或“”或“,”?那么我应该只检索数字并确定它们的样式并正确格式化吗?

4

2 回答 2

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 中使用正则表达式组,请查看此处

于 2012-10-19T06:44:11.607 回答
1

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

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

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

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

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

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

于 2012-10-19T06:50:20.560 回答