Regex 意大利电话10位数正则表达式发行
我正试图使用来自的正则表达式 对于意大利移动电话号码,但简单的号码如3491234567无效 (不在乎空间,我会修剪它们) 两个都通过了验证,怎么了 更新: 澄清: 正则表达式应该匹配以任意一个开头的任何数字 388/389/380Regex 意大利电话10位数正则表达式发行,regex,Regex,我正试图使用来自的正则表达式 对于意大利移动电话号码,但简单的号码如3491234567无效 (不在乎空间,我会修剪它们) 两个都通过了验证,怎么了 更新: 澄清: 正则表达式应该匹配以任意一个开头的任何数字 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
(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)?
下面的正则表达式似乎满足了您的要求。我去掉了语法错误并进行了一些猜测,然后添加了缺少的部分以覆盖您的TODO注释
^(\((00|\+)39\)|(00|\+)39)?(38[890]|34[7-90]|36[680]|33[3-90]|32[89])\d{7}$
演示:
您的测试用例无法覆盖正则表达式捕获的许多变体;也许您需要增强测试集,以确保它符合您的要求
开头允许使用带括号或不带括号的可选国际前缀。基本模式是(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
有明显的意外缺口,随着时间的推移,这些缺口可能也会被填补。进一步推广这一点可能会提高对未来变化的适应能力,但当然也可能同时增加误报的风险。决定哪一个更糟。我发现了这个,并用新的运算符和MVNO前缀(Iliad,ho.)进行了更新
我改进了regex,添加了case来处理数字之间的空格:
^(\((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:
不带特殊字符的移动意大利号码的简单正则表达式为:
/^3[0-9]{8,9}$/
它匹配以数字“3”开头,后跟8或9位的字符串,例如:
3345678103
然后可以添加意大利语前缀,如“+39”或“0039”
/^+393[0-9]{8,9}$/-匹配-->+393345678103
/^\0039 3[0-9]{8,9}$/--match-->0039 3345678103我建议当您看到一个内部有管道的正则表达式时要非常小心。就正则表达式而言,这个站点是不可信的。如何使用正则表达式?请发布代码。@WiktorStribiżew为什么要小心使用管道的正则表达式?因为这很可能是人为错误。我指的是角色类中的管道,而不是模式中的管道。顺便问一下,这里的
{3-9}
是什么意思?它字面上与{3-9}
匹配。意大利电话号码中有这样的电话部分吗?如何拨打{
?[{8,9}| 0]
匹配1个符号:{
或8
,或,
或9
…意大利电话号码中有逗号吗?不要使用这个正则表达式,自己写一个,它是垃圾。我想你指的是(36[6 | 8 | 0])
part,我没有注意到。不管怎样,我认为它是用来验证一个以36
开头,以6
或8
或0
结尾的数字。那部分正确吗?不,不,不。模式是垃圾。找到需求,从头开始编写正确的模式。我会的,谢谢。你的表达现在还不错,我会尽快进一步调查。谢谢!如果你能解释这意味着什么和/或链接到更多信息,我可能也会更新我的答案以保持最新。MVNO是什么?Iliad是谁?(显然是电话接线员?)MVNO是“虚拟运营商”,他们有自己的前缀。Iliad去年在意大利开始作为主要运营商,分配了351个前缀。还修复了34x系列,因为它只接受347-8-9-0,但我们有344和345个数字。PS:我想评论你的答案,而不是添加新的,但我没有足够的声誉。顺便说一句,谢谢你,这是最好的答案ound Before还更改了最终数字计数。仍在使用333 123456等旧数字。我会为前缀添加一个OR。类似这样的操作可能会实现^((?:0039)?|(?:\+39)?)3[0-9]{8,9}$
^ # 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
^(\((00|\+)39\)|(00|\+)39)?(38[890]|34[4-90]|36[680]|33[13-90]|32[89]|35[01]|37[019])\d{6,7}$
^(\((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})$