我对正则表达式有点新意,所以我还不太了解它的可能性。因此,我不知道解决这个问题是否困难。
我有非常宽松的格式化手机字符串,需要以固定的方式格式化它们(至少尽我所能)。 “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部分?我可以用“;”拆分它吗?或“”或“,”?那么我应该只检索数字并确定它们的风格并正确格式化吗?
答案 0 :(得分: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。
答案 1 :(得分:1)
我建议采用不同的方法:
首先,将字符串拆分为分隔电话号码的字符:
result = subject.split(/[,;]/);
其次,在每个子字符串上,删除所有非数字字符(可能除了+
以外,以便保留有关国际号码的信息):
result[i] = result[i].replace(/[^\d+]+/g, "");
现在你所有的数字都没有任何分隔符。然后你可以查看字符串,将它们分类到不同的类别(移动,固定电话,国际等),并可能重新引入自己的分隔符。如果你想要的话。