Использование немного другого подхода также может быть полезным для вас ... Я использовал такой подход, как раньше, при получении информации о номере телефона, которая включает извлечение необходимой информации и ее переформатирование - у вас могут быть требования, которые неподходит для этого решения, но я бы все равно предложил его.
Используя это выражение соответствия:
(?i)^\D*1?\D*([2-9])\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d)[^x]*?\s*(?:(?:e?(x)(?:\.|t\.?|tension)?)\D*(\d+))?.*$
и это выражение замены:
($1$2$3) $4$5$6-$7$8$9$10 $12$13
вам следуетбыть в состоянии переформатировать эти входные данные, как указано:
Input Output
----------------------------- --------------------------------
"1323-456-7890 540" "(323) 456-7890 "
"8648217634" "(864) 821-7634 "
"453453453322" "(453) 453-4533 "
"@404-327-4532" "(404) 327-4532 "
"172830923423456" "(728) 309-2342 "
"17283092342x3456" "(728) 309-2342 x3456"
"jh345gjk26k65g3245" "(345) 266-5324 "
"jh3g24235h2g3j5h3x245324" "(324) 235-2353 x245324"
"12345678925x14" "(234) 567-8925 x14"
"+1 (322)485-9321" "(322) 485-9321 "
"804.555.1234" "(804) 555-1234 "
Я предоставлю вам, что это не самое эффективное выражение, но неэффективное регулярное выражение не является обычно проблемой при запуске на короткомобъем текста, особенно если он написан со знанием и небольшим вниманием
Чтобы немного разбить выражение синтаксического анализа:
(?i)^\D*1?\D* # mode=ignore case; optional "1" in the beginning
([2-9])\D*(\d)\D*(\d)\D* # three digits* with anything in between
(\d)\D*(\d)\D*(\d)\D* # three more digits with anything in between
(\d)\D*(\d)\D*(\d)\D*(\d)[^x]*? # four more digits with anything in between
\s* # optional whitespace
(?:(?:e?(x)(?:\.|t\.?|tension)?) # extension indicator (see below)
\D*(\d+))? # optional anything before a series of digits
.*$ # and anything else to the end of the string"
Три цифры не могут начинаться с 0 или 1.Индикатор расширения может быть x
, ex
, xt
, ext
(каждый из которых может иметь точку в конце), extension
или xtension
(который не может иметь точку вконец).
Как написано, расширение (то есть цифры) должно представлять собой непрерывный ряд чисел (но обычно это так, как предполагает ваше данное выражение)
Идеясостоит в том, чтобы использовать механизм регулярных выражений для извлечения первых 10 цифр (исключая «0» и «1», потому что внутренние телефонные номера в США не начинаются с них (кроме как с переключателем, который не нужен или всегда нужен, и не являетсязависит от телефона получателя, но телефон, в который вы его набираете.Затем он попытается вытащить что-нибудь до «x» и захватить «x» вместе с первой последовательной последовательностью цифр после этого.
Это допускает значительный допуск в форматировании ввода, в то время какв то же время удаляя вредоносные данные или метасимволы, затем выдает последовательно отформатированный номер телефона (что часто ценится на многих уровнях)