我正在尝试使用本站的正则表达式
/^([+]39)?((38[{8,9}|0])|(34[{7-9}|0])|(36[6|8|0])|(33[{3-9}|0])|(32[{8,9}]))([\d]{7})$/
对于,意大利移动电话号码,但是一个简单的号码,如3491234567,结果无效。
(不要在意空间,因为我会修剪它们)
should pass:
349 1234567
+39 349 1234567
TODO: 0039 349 1234567
TODO: (+39) 349 1234567
TODO: (0039) 349 1234567
regex101和雷杰斯都通过了验证.怎么了?
更新:
为了澄清:正则表达式应该匹配任何以任一数字开头的数字。
388/389/380 (38[{8,9}|0])|
或347/348/349/340 (34[{7-9}|0])|
或366/368/360 (36[6|8|0])|
或333/334/335/336/337/338/339/330 (33[{3-9}|0])|
328/329 (32[{8,9}])
加7位([\d]{7})
开始时的+39 (可选的([+]39)?
)
发布于 2016-03-04 11:46:05
下面的正则表达式似乎满足了您的要求。我取出语法错误,并猜测了一点,并添加了缺失的部分,以涵盖您的TODO注释。
^(\((00|\+)39\)|(00|\+)39)?(38[890]|34[7-90]|36[680]|33[3-90]|32[89])\d{7}$
演示:https://regex101.com/r/yF7bZ0/1
您的测试用例未能涵盖regex捕获的许多变体;也许您希望增强测试集,以确保它能满足您的需要。
开头允许使用带括号或不带括号的可选国际前缀。基本模式是(00|\+)39
,它被重复使用或不带括号。(一种更好的总体方法可能是在开始处理之前修剪括号和标点符号以及空格;当然,您希望保持加号的重要性。)
使用@Edoardo答复中的信息进行更新;包装以便于阅读并添加评论:
^ # beginning of line
(\((00|\+)39\)|(00|\+)39)? # country code or trunk code, with or without parentheses
( # followed by one of the following
32[89]| # 328 or 329
33[013-9]| # 33x where x != 2
34[04-9]| # 34x where x not in 1,2,3
35[01]| # 350 or 351
36[068]| # 360 or 366 or 368
37[019] # 370 or 371 or 379
38[089]) # 380 or 388 or 389
\d{6,7} # ... followed by 6 or 7 digits
$ # and end of line
有明显的意外缺口,这可能也会随着时间的推移得到填补。进一步推广这一点可能会提高对未来变化的应变能力,但同时也可能增加出现假阳性的风险。决定哪一个更糟。
发布于 2019-04-23 12:01:23
我发现了这一点,并更新了新的操作符和MVNO前缀(Iliad,ho)。
^(\((00|\+)39\)|(00|\+)39)?(38[890]|34[4-90]|36[680]|33[13-90]|32[89]|35[01]|37[019])\d{6,7}$
发布于 2019-06-26 14:04:53
我改进了正则表达式,增加了处理数字之间空间的情况:
^(\((00|\+)39\)|(00|\+)39)?(38[890]|34[4-90]|36[680]|33[13-90]|32[89]|35[01]|37[019])(\s?\d{3}\s?\d{3,4}|\d{6,7})$
因此,例如,我可以匹配电话号码如下(0039) 349 123 4567或这349 123 4567
https://stackoverflow.com/questions/35794734
复制相似问题