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$