加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

我可以优化这个手机正则表达式吗?

发布时间:2020-12-13 22:54:55 所属栏目:百科 来源:网络整理
导读:好的,所以我有这个正则表达式: ( |^|)(((((((+|00)(31|32)( )?((0))?)|0)([0-9]{2})(-)?( )?)?)([0-9]{7}))|((((((+|00)(31|32)( )?((0))?)|0)([0-9]{3})(-)?( )?)?)([0-9]{6}))|((((((+|00)(31|32)( )?((0))?)|0)([0-9]{1})(-)?( )?)?)([0-9]{8})
好的,所以我有这个正则表达式:
( |^|>)(((((((+|00)(31|32)( )?((0))?)|0)([0-9]{2})(-)?( )?)?)([0-9]{7}))|((((((+|00)(31|32)( )?((0))?)|0)([0-9]{3})(-)?( )?)?)([0-9]{6}))|((((((+|00)(31|32)( )?((0))?)|0)([0-9]{1})(-)?( )?)?)([0-9]{8})))( |$|<)

它格式化荷兰和比利时电话号码(我只想要那些31和32作为国家代码).

它不是很有趣的破译,但你可以看到它也有很多重复.但现在它确实非常准确地处理它

所有以下欧洲格式的电话号码都被接受

0031201234567
0031223234567
0031612345678
+31(0)20-1234567
+31(0)223-234567
+31(0)6-12345678
020-1234567
0223-234567
06-12345678
0201234567
0223234567
0612345678

并且以下的错误格式化的没有

06-1234567 (mobile phone number in the Netherlands should have 8 numbers after 06 )
0223-1234567 (area code with home phone)

相反,这是好的.

020-1234567 (area code with 3 numbers has 7 numbers for the phone as opposed to a 4 number area code which can only have 6 numbers for phone number)

正如你可以看到的那样,这个’ – ‘字符使它有点困难,但我需要它在那里,因为它是人们通常使用的格式的一部分,我想要能够解析它们.

现在是我的问题…您是否看到一种方法来简化正则表达式(如果您看到错误,您甚至可以改进它),同时遵守相同的规则?

你可以在regextester.com测试

(‘(| ^ |>)’是检查一个单词的开头是否有可能在新行或’>’之前,我在HTML页面中搜索电话号码.)

第一个观察:阅读正则表达式是一场噩梦.它为Perl / x模式呼出.

第二个观察:表达中有许多很多的捕捉括号(42)如果我算得上正确;当然42是“生命答案,宇宙和一切” – 见道格拉斯·亚当斯(Douglas Adams) Hitchiker’s Galaxy of the Galaxy“如果您需要解释的话).

比尔的蜥蜴注意到你使用'( – )?()?’几次.与“ – ”相比,没有明显的优势?或者可能是'[ – ]?’,除非你真的打算分别捕获实际的标点符号(但是有这么多的捕捉括号),使用’$n’项目将是困难的).

所以,让我们来试一试你的单行:

( |^|>)
(
    ((((((+|00)(31|32)( )?((0))?)|0)([0-9]{2})(-)?( )?)?)([0-9]{7})) |
    ((((((+|00)(31|32)( )?((0))?)|0)([0-9]{3})(-)?( )?)?)([0-9]{6})) |
    ((((((+|00)(31|32)( )?((0))?)|0)([0-9]{1})(-)?( )?)?)([0-9]{8}))
)
( |$|<)

OK – 现在我们可以看到正则表达式的正则结构.

这里有更多的分析可能.是的,正则表达式可以有很大的改进.第一个明显的一个是提取国际前缀部分,并应用一次(可选地,或要求前导零),然后应用国家规则.

( |^|>)
(
    (((+|00)(31|32)( )?((0))?)|0)
    (((([0-9]{2})(-)?( )?)?)([0-9]{7})) |
    (((([0-9]{3})(-)?( )?)?)([0-9]{6})) |
    (((([0-9]{1})(-)?( )?)?)([0-9]{8}))
)
( |$|<)

然后我们可以简化如前所述的标点符号,并删除一些合理的冗余圆括号,并改进国家代码识别器:

( |^|>)
(
    (((+|00)3[12] ?((0))?)|0)
    (((([0-9]{2})-? ?)?)[0-9]{7}) |
    (((([0-9]{3})-? ?)?)[0-9]{6}) |
    (((([0-9]{1})-? ?)?)[0-9]{8})
)
( |$|<)

我们可以观察到,正则表达式并没有强制执行手机代码规则(所以它并不坚持’06’后面是8位,例如).它也似乎允许1,2或3位数的“交换”代码是可选的,即使使用国际前缀 – 可能不是你所想的,而修复它会删除一些更多的括号.之后,我们可以删除更多的括号,导致:

( |^|>)
(
    (((+|00)3[12] ?((0))?)|0)    # International prefix or leading zero
    ([0-9]{2}-? ?[0-9]{7}) |        # xx-xxxxxxx
    ([0-9]{3}-? ?[0-9]{6}) |        # xxx-xxxxxx
    ([0-9]{1}-? ?[0-9]{8})          # x-xxxxxxxx
)
( |$|<)

你可以从这里进一步优化,我希望.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读