Мое совпадение с регулярным выражением - это захват дополнительных пробелов в начале и конце. Как я могу только захватить номер телефона? - PullRequest
0 голосов
/ 22 января 2019

Я использую это регулярное выражение для захвата телефонных номеров из длинной строки:

\s*(?:\+?(\d{1,3}))?[-. (]*(\d{3})[-. )]*(\d{3})[-. ]*(\d{4})(?: *x(\d+))?\s*

тестовая строка:

asdjasjkdh 1 800 555 1234 01/01/2012 asdhajksdh 18005551234 jkas 12/11/2012 hd sample@email.com asdha jksdh asjdhjak +86 800 555 1234 sdkajs test@gmail.com lorem ipsume. I am dotminors.zszsd@gmail.ca 18005551234 SADASDD +1 800 555-1234 SSDA ASASD 1-800-555-1234 1 (800) 555-1234 asdsasdadsadasda sdada 8005551234 x5678 wkadakasd asdjsadksad (800)5551234

" 1 800 555 1234 ",
"     18005551234 ",
" +86 800 555 1234 ",
" 18005551234 ",
" +1 800 555-1234 ",
" 1-800-555-1234 ",
"1 (800) 555-1234 ",
" 8005551234 x5678 ",
" (800)5551234"

Как вы заметили, некоторые из чисел имеют пробелы в начале или в конце. Как я могу получить только часть телефонного номера, не выполняя после этого отдельную обрезку?

РЕДАКТИРОВАТЬ: Если я удаляю \s* на обоих концах, это дает мне несколько телефонных номеров без последней цифры. Я обновил свой вопрос с выводом:

"1 800 555 1234",
"     1800555123",
"+86 800 555 1234",
" 1800555123",
"+1 800 555-1234",
"1-800-555-1234",
"1 (800) 555-1234",
" 8005551234 x5678",
" (800)5551234"

Как вы заметите, на втором и четвертом телефонных номерах в конце пропущена цифра «4», и все еще остается пробел.

1 Ответ

0 голосов
/ 22 января 2019

В дополнение к удалению \s* в начале и в конце, также удалите пробел из первого набора символов, сразу после дополнительной группы захвата - вместо этого поместите пробел внутри этой первой группы захвата, чтобы убедиться, что, если первая группа не совпадает, совпадение не начинается с пробелов:

(?:\+?(\d{1,3}) *)?[-.(]*(\d{3})[-. )]*(\d{3})[-. ]*(\d{4})(?: *x(\d+))?
               ^^   ^^^

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

...