Я хотел бы получить номера телефона из файла. Я знаю, что числа имеют различные формы, я могу обработать для единственного, но не знаю, как получить универсальную форму regex. Например,
xxx-xxx-xxxx
(xxx)xxx-xxxx
xxx xxx xxxx
xxxxxxxxxx
Я могу только обработать 1, 2, и 4 вместе
grep '[0-9]\{3\}[ -]\?[0-9]\{3\}[ -]\?[0-9]\{4\}' file
Есть ли какой-либо единственный regex, может обработать все эти четыре формы?
grep '\(([0-9]\{3\})\|[0-9]\{3\}\)[ -]\?[0-9]\{3\}[ -]\?[0-9]\{4\}' file
Пояснение:
([0-9]\{3\})
три цифры внутри скобок
\|
или
[0-9]\{3\}
три цифры не внутри скобок
... с группирующими скобками - \(...\)
- вокруг чередования, чтобы остальная часть регекса вела себя одинаково независимо от того, какая альтернатива совпадает.
Я получил следующее:
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$
Вы можете просто ИЛИ ( |
) ваши регулярные выражения вместе - так они тоже будут более читабельны!
Моя первая мысль заключается в том, что вам будет легче увидеть, совпадает ли ваш номер кандидата с одним из четырех регулярных выражений. Это будет легче разработать / отладить, особенно когда / когда вам придется обрабатывать дополнительные форматы в будущем.
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}'