grep с регулярным выражением для номера телефона - PullRequest
15 голосов
/ 16 февраля 2010

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

  1. xxx-xxx-xxxx

  2. (xxx)xxx-xxxx

  3. xxx xxx xxxx

  4. xxxxxxxxxx

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

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

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

Ответы [ 11 ]

18 голосов
/ 16 февраля 2010
grep '\(([0-9]\{3\})\|[0-9]\{3\}\)[ -]\?[0-9]\{3\}[ -]\?[0-9]\{4\}' file

Пояснение:

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

\| или

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

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

6 голосов
/ 04 апреля 2013

Обычно существует четыре типа телефонных номеров

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

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

5 голосов
/ 07 апреля 2013

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

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

Объяснение:

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

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

2 голосов
/ 16 февраля 2010

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

1 голос
/ 16 февраля 2010
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}'
1 голос
/ 16 февраля 2010

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

0 голосов
/ 28 сентября 2016
grep -oE '\(?\<[0-9]{3}[-) ]?[0-9]{3}[ -]?[0-9]{4}\>'

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

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

0 голосов
/ 08 августа 2016

+? (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

0 голосов
/ 02 декабря 2015

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

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
0 голосов
/ 04 января 2013

Попробуйте это:

^(\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})$

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

  1. xxxxxxxxxx
  2. xxx xxx xxxx
  3. xxx-xxx-xxxx
  4. (xxx)xxx-xxxx
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...