Объединение нескольких регулярных выражений - PullRequest
0 голосов
/ 05 ноября 2018

Так что у меня проблема с поиском разных типов телефонных номеров:

Они могут в следующих форматах:

+xx xx xxxxxxxx - /[+][0-9]{2}\s[0-9]{2}[0-9]{8}/
xxxx xxxxxx     -   /[0-9]{4}\s[0-9]{6}/
xxxxx xxxxxx - /[0-9]{5}\s[0-9]{6}/
xxxxxxxxxxx -    /[0-9]{11}
+xx xxxxxxxxxx  - / [+][0-9]{2}\s[0-9]{10}
xxxx xxxxxxxxxx  - /[0-9]{4} \s0-9]{10}/

Я написал регулярное выражение для каждого, но не уверен, как объединить его в одно большое выражение, чтобы найти их все.

Как я могу объединить это в одно большое выражение, чтобы он мог найти все эти форматы чисел, если бы он просматривал файл чисел.

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Поскольку ваши форматы - это просто текстовые строки,

+xx xx xxxxxxxx
xxxx xxxxxx
xxxxx xxxxxx
xxxxxxxxxxx
+xx xxxxxxxxxx
xxxx xxxxxxxxxx

Если вы запускаете свои форматы с помощью этого инструмента

это даст вам регулярное выражение, подобное этому

     \+xx [ ] xx
     (?: [ ] )?
     xxxxxxxx
  |  xxxx
     (?:
          [ ] xxxxxx
          (?: xxxx )?
       |  x
          (?: [ ] )?
          xxxxxx
     )

где вы просто заменяете [ ] на \s{1,9} и x на \d
давая ваше последнее регулярное выражение

\+\d{2}\s{1,9}\d{2}(?:\s{1,9})?\d{8}|\d{4}(?:\s{1,9}\d{6}(?:\d{4})?|\d(?:\s{1,9})?\d{6})

https://regex101.com/r/nF2L9T/1

    \+ \d{2} \s{1,9} \d{2} 
     (?: \s{1,9} )?
     \d{8} 
  |  
     \d{4} 
     (?:
          \s{1,9} \d{6} 
          (?: \d{4} )?
       |  \d 
          (?: \s{1,9} )?
          \d{6} 
     )

Поскольку это полноценный троичный три, он может быть в разы быстрее обычного
куча чередований.

Regex1:   \+\d{2}\s{1,9}\d{2}(?:\s{1,9})?\d{8}|\d{4}(?:\s{1,9}\d{6}(?:\d{4})?|\d(?:\s{1,9})?\d{6})
Options:  < none >
Completed iterations:   50  /  50     ( x 1000 )
Matches found per iteration:   6
Elapsed Time:    0.72 s,   715.33 ms,   715325 µs
Matches per sec:   419,389
0 голосов
/ 05 ноября 2018

Если вам просто нужно одно регулярное выражение, которое улавливает все эти случаи, вы можете просто 'или' собрать вместе предоставленные вами случаи:

(?:[+][0-9]{2}\s[0-9]{2}[0-9]{8})|(?:[0-9]{4}\s[0-9]{6})|(?:[0-9]{5}\s[0-9]{6})|(?:[0-9]{11})|(?:[+][0-9]{2}\s[0-9]{10})|(?:[0-9]{4} \s0-9]{10})

Я просто упаковал каждое регулярное выражение в группу без захвата (?:) и или | их вместе.

Тем не менее, это ничем не отличается от итерации и проверки каждого регулярного выражения в отдельности, и его гораздо легче обслуживать. Я бы проверял дела индивидуально.

...