Grep с регулярным выражением для номера телефона

Я хотел бы получить номера телефонов из файла. Я знаю, что числа имеют разные формы, я могу обрабатывать один, но не знаю, как получить равномерное регулярное выражение. Например

  • xxx-xxx-xxxx

  • (xxx)xxx-xxxx

  • xxx xxx xxxx

  • xxxxxxxxxx

Я могу обрабатывать только 1, 2 и 4 вместе

grep '[0-9]\{3\}[ -]\?[0-9]\{3\}[ -]\?[0-9]\{4\}' file

Есть ли какое-либо одно регулярное выражение для обработки всех этих четырех форм?

Ответ 1

grep '\(([0-9]\{3\})\|[0-9]\{3\}\)[ -]\?[0-9]\{3\}[ -]\?[0-9]\{4\}' file

Пояснение:

([0-9]\{3\}) три цифры в круглых скобках

\| или

[0-9]\{3\} три цифры не внутри parens

... с группировкой круглых скобок - \(...\) - вокруг чередования, так что остальное регулярное выражение ведет себя одинаково независимо от того, какая альтернатива соответствует.

Ответ 2

Обычно есть четыре шаблона телефонных номеров

1. xxx-xxx-xxxx         grep -o '[0-9]\{3\}\-[0-9]\{3\}\-[0-9]\{4\}'  file.txt
2. (xxx)xxx-xxxx        grep -o '([0-9]\{3\})[0-9]\{3\}\-[0-9]\{4\}'  file.txt
3. xxx xxx xxxx         grep -o '[0-9]\{3\}\s[0-9]\{3\}\s[0-9]\{4\}'  file.txt
4. xxxxxxxxxx           grep -o '[0-9]\{10\}' file.txt

Во всех

grep -o '\([0-9]\{3\}\-[0-9]\{3\}\-[0-9]\{4\}\)\|\(([0-9]\{3\})[0-9]\{3\}\-[0-9]\{4\}\)\|\([0-9]\{10\}\)\|\([0-9]\{3\}\s[0-9]\{3\}\s[0-9]\{4\}\)' file.txt

Конечно, можно было бы упростить регулярное выражение выше, но мы также можем оставить это упрощение grep себе ~

Ответ 3

Вы можете просто OR (|) ваши регулярные выражения вместе - также будет более читаемым!

Ответ 4

Это просто модифицированная версия решения Алана Мура. Это защищено от некоторых условий гонки, когда последняя часть номера имеет более четырех цифр в ней или если общее число цифр больше 10:

grep '\(\(([0-9]\{3\})\|[0-9]\{3\}\)[ -]\?\)\{2\}[0-9]\{4\} '

Объяснение:

  • \(([0-9]\{3\})\|[0-9]\{3\}\) соответствует ровно три цифры (например, 234) с или без круглых скобок. \| выполняет операцию "ИЛИ".
  • Первые \( ... \) группируют вместе вышеприведенный формат, а затем space или - или no space вообще - ([ -]\?).
  • \{2\} соответствует ровно двум вхождениям вышеперечисленного
  • [0-9]\{4\} ' соответствует точно одному вхождению для 4-значного числа, за которым следует space

И это немного короче. Протестировано на RHEL и Ubuntu. Ура!!

Ответ 5

Моя первая мысль состоит в том, что вам может быть легче увидеть, совпадает ли ваш номер кандидата с одним из четырех регулярных выражений. Это будет легче разрабатывать/отлаживать, особенно когда/когда вам придется обрабатывать дополнительные форматы в будущем.

Ответ 6

grep -P '[0-9]{3}-[0-9]{3}-[0-9]{3}|[0-9]{3}\ [0-9]{3}\ [0-9]{3}|[0-9]{9}|\([0-9]{3}\)[0-9]{3}-[0-9]{3}'

Ответ 7

Попробуйте следующее:

^(\d{10}|((([0-9]{3})\s){2})[0-9]{4}|((([0-9]{3})\-){2})[0-9]{4}|([(][0-9]{3}[)])[0-9]{3}[-][0-9]{4})$

Это применимо только к формату, который вы упомянули выше:

  • xxxxxxxxxx
  • xxx xxx xxxx
  • xxx-xxx-xxxx
  • (xxx)xxx-xxxx

Ответ 8

Мы можем поместить все необходимые проверки номера телефона один за другим, используя условие или условие, которое с большей вероятностью будет работать (но утомительное кодирование).

grep '^[0-9]\{10\}$\|^[0-9]\{3\}[-][0-9]\{3\}[-][0-9]\{4\}$\|^[0-9]\{3\}[ ][0-9]\{3\}[ ][0-9]\{4\}$\|^[(][0-9]\{3\}[)][0-9]\{3\}[-][0-9]\{4\}$' phone_number.txt

возвращает все конкретные форматы:

  • 920-702-9999
  • (920) 702-9999
  • 920 702 9999
  • 9207029999

Ответ 9

+? (1 [-])? ((\ d {3}) [-] | (\ d {3} [-]?)) {2}\d {4}

работает для:

123-678-1234

123 678 1234

(123) -678-1234

+ 1- (123) -678-1234

1- (123) -678-1234

1 123 678 1234

1 (123) 678 1234

Ответ 10

grep -oE '\(?\<[0-9]{3}[-) ]?[0-9]{3}[ -]?[0-9]{4}\>'

Совпадает со всеми вашими форматами.

Границы слов \< и \> не позволяют совместить слишком длинные номера, например 123-123-12345 или 1234-123-1234

Ответ 11

Я получил это:

debian:tmp$ cat p.txt
333-444-5555
(333)333-6666
123 456 7890
1234567890
debian:tmp$ egrep '\(?[0-9]{3}[ )-]?[0-9]{3}[ -]?[0-9]{4}' p.txt
333-444-5555
(333)333-6666
123 456 7890
1234567890
debian:tmp$ egrep --version
GNU grep 2.5.3

Copyright (C) 1988, 1992-2002, 2004, 2005  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

debian:tmp$