Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Italian phone 10-digit number regex issue

Tags:

regex

I'm trying to use the regex from this site

/^([+]39)?((38[{8,9}|0])|(34[{7-9}|0])|(36[6|8|0])|(33[{3-9}|0])|(32[{8,9}]))([\d]{7})$/

for italian mobile phone numbers but a simple number as 3491234567 results invalid.

(don't care about spaces as i'll trim them)

should pass:
349 1234567
+39 349 1234567
TODO: 0039 349 1234567
TODO: (+39) 349 1234567
TODO: (0039) 349 1234567

regex101 and regexr both pass the validation..what's wrong?

UPDATE:

To clarify: The regex should match any number that starts with either

388/389/380 (38[{8,9}|0])|

or 347/348/349/340 (34[{7-9}|0])|

or 366/368/360 (36[6|8|0])|

or 333/334/335/336/337/338/339/330 (33[{3-9}|0])|

328/329 (32[{8,9}])

plus 7 digits ([\d]{7})

and the +39 at the start optionally ([+]39)?

like image 204
AlexanderD Avatar asked Mar 04 '16 11:03

AlexanderD


1 Answers

The following regex appears to fulfill your requirements. I took out the syntax errors and guessed a bit, and added the missing parts to cover your TODO comments.

^(\((00|\+)39\)|(00|\+)39)?(38[890]|34[7-90]|36[680]|33[3-90]|32[89])\d{7}$

Demo: https://regex101.com/r/yF7bZ0/1

Your test cases fail to cover many of the variations captured by the regex; perhaps you'll want to beef up the test set to make sure it does what you want.

The beginning allows for an optional international prefix with or without the parentheses. The basic pattern is (00|\+)39 and it is repeated with or without parentheses around it. (Perhaps a better overall approach would be to trim parentheses and punctuation as well as whitespace before processing begins; you'll want to keep the plus as significant, of course.)

Updated with information from @Edoardo's answer; wrapped for legibility and added comments:

^                           # 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

There are obvious accidental gaps which will probably also get filled over time. Generalizing this further is likely to improve resilience toward future changes, but of course may at the same time increase the risk of false positives. Make up your mind about which is worse.

like image 112
tripleee Avatar answered Nov 02 '22 00:11

tripleee