gpt4 book ai didi

regex - 我可以优化这个电话正则表达式吗?

转载 作者:行者123 更新时间:2023-12-02 02:48:44 26 4
gpt4 key购买 nike

好的,所以我有这个正则表达式:

( |^|>)(((((((\+|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 是“生命、宇宙和一切的答案”——参见道格拉斯·亚当斯的《银河系漫游指南》(如果您需要解释的话)。

蜥蜴比尔注意到您多次使用“(-)?( )?”。与'-?相比,没有明显的优势。 ?' 或者可能是 '[- ]?',除非您真的打算单独捕获实际的标点符号(但是有很多捕获括号计算出哪个 '$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}))
)
( |$|<)

好的 - 现在我们可以看到正则表达式的正则结构。

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

( |^|>)
(
(((\+|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
)
( |$|<)

我希望您可以从这里进行进一步的优化。

关于regex - 我可以优化这个电话正则表达式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/268771/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com