我试图使用this site
中的正则表达式/^([+]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和regexr都通过了验证......有什么不对?
更新
澄清: 正则表达式应匹配任何以
开头的数字 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)?
答案 0 :(得分:6)
以下正则表达式似乎符合您的要求。我拿出了语法错误并猜了一下,并添加了缺少的部分来涵盖你的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
您的测试用例未能涵盖正则表达式捕获的许多变体;也许你会想要加强测试集以确保它能达到你想要的效果。
开头允许带或不带括号的可选国际前缀。基本模式为(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
随着时间的推移,可能会出现明显的意外差距。进一步推广这可能会提高对未来变化的抵御能力,但当然可能同时增加误报的风险。决定哪个更糟糕。
答案 1 :(得分:1)
我发现了这一点,并更新了新的运算符和MVNO前缀(霍里亚州伊利亚德)
^(\((00|\+)39\)|(00|\+)39)?(38[890]|34[4-90]|36[680]|33[13-90]|32[89]|35[01]|37[019])\d{6,7}$
答案 2 :(得分:0)
我改进了正则表达式,增加了大小写以处理数字之间的空格:
{{1}}
例如,我可以匹配这样的电话号码(0039)349 123 4567或此349 123 4567
答案 3 :(得分:0)
以下文档:
https://it.qaz.wiki/wiki/Telephone_numbers_in_Italy
不带特殊字符的移动意大利语数字的简单正则表达式是:
/ ^ 3 [0-9] {8,9} $ /
它匹配以数字'3'开头,后跟8或9位数字的字符串,例如:
3345678103
您可以添加ITALIAN前缀,例如“ +39”或“ 0039”
/ ^ + 39 3 [0-9] {8,9} $ /--匹配-> +39 3345678103
/ ^ \ 0039 3 [0-9] {8,9} $ /--匹配-> 0039 3345678103