Регулярное выражение для поиска номеров телефонов
Возможные дубликаты:
Полное регулярное выражение для проверки номера телефона
grep с регулярным выражением для номера телефона
Привет всем,
Я новичок в Stackoverflow, и у меня есть быстрый вопрос. Предположим, нам дано большое количество HTML файлов (больших, как в теоретическом смысле). Как я могу использовать регулярные выражения для извлечения списка телефонных номеров из всех этих файлов?
Пояснение/выражение будет действительно оценено. Номера телефонов могут быть в любом из следующих форматов:
- (123) 456 7899
- (123).456.7899
- (123) -456-7899
- 123-456-7899
- 123 456 7899
- 1234567899
Большое спасибо за вашу помощь и получите хороший!
Ответы
Ответ 1
/^[\.-)( ]*([0-9]{3})[\.-)( ]*([0-9]{3})[\.-)( ]*([0-9]{4})$/
Выполнять то, что вы пытаетесь сделать.
Первая часть ^
означает "начало строки", которая заставит ее учитывать всю строку.
[\.-)( ]*
, который у меня есть, означает "любой период, дефис, скобки или пробел, появляющиеся 0 или более раз".
Кластеры ([0-9]{3})
соответствуют группе из трех чисел (последний из них соответствует 4)
Надеюсь, что это поможет!
Ответ 2
Не зная, какой язык вы используете, я не уверен, правилен ли синтаксис.
Это должно соответствовать всем вашим группам с очень небольшим количеством ложных срабатываний:
/\(?([0-9]{3})\)?([ .-]?)([0-9]{3})\2([0-9]{4})/
Группы, которые будут вам интересны после матча, это группы 1, 3 и 4. Группа 2 существует только для того, чтобы убедиться, что первый и второй разделительные символы
, .
или -
совпадают.
Например, команда sed, чтобы удалить символы и оставить номера телефонов в форме 123456789:
sed "s/(\{0,1\}\([0-9]\{3\}\))\{0,1\}\([ .-]\{0,1\}\)\([0-9]\{3\}\)\2\([0-9]\{4\}\)/\1\3\4/"
Вот ложные срабатывания моего выражения:
- (123) 456789
- (123456789
- (123 456 789
- (123.456.789
- (123-456-789
- 123) 456789
- 123) 456 789
- 123).456.789
- 123) -456-789
Разрыв выражения на две части, совпадающие с круглыми скобками, и один, который не устранит все эти ложные срабатывания, кроме первого:
/\(([0-9]{3})\)([ .-]?)([0-9]{3})\2([0-9]{4})|([0-9]{3})([ .-]?)([0-9]{3})\5([0-9]{4})/
В этом случае важны группы 1, 3 и 4 или 5, 7 и 8.
Ответ 3
Это поможет вам уловить код с круглым скобком
([0-9]\{3\})[ .-][0-9]\{3\}[ .-][0-9]\{4\}
Другие:
[0-9]\{3\}[ -][0-9]\{3\}[ -][0-9]\{4\}
[0-9]\{10\}
Я отделил первый и второй, потому что объединение их без обратного отслеживания могло заставить вас принять (123 456 7890
или 123) 456 7890
Заметьте также, что на моем терминале с помощью grep
мне пришлось избежать { }
для повторения. Вам может не понадобиться, или вам может понадобиться избегать других символов в зависимости от того, где вы собираетесь использовать это.
Ответ 4
^(\(?\d{3}\)?)([ .-])(\d{3})([ .-])(\d{4})$
Это должно соответствовать всем, кроме последнего шаблона.
Для последнего можно использовать выделенный шаблон ^\d{10}$
И есть ошибка, она будет соответствовать (123 456 7899
-
^(\(?\d{3}\)?)
, если мы сломаем этот код, первый символ (^
) соответствует началу текста. \(?
и \)?
будут принимать или не использовать этот символ, есть проблема, связанная с тем, что вы должны проверить, было ли открытие char, если было второе, чтобы соответствовать, я не знаю, возможен используя Regex только. И \d{3}
будет соответствовать трем номерам
-
([ .-])
будет соответствовать любому из них, но только один и только один раз.
-
(\d{3})
будет соответствовать трем номерам
-
То же, что 2
-
(\d{4})$
четыре числа, за которыми следует конец текста ($
)
Поскольку вы хотите извлечь из HTML-страницы, вам придется игнорировать ^
и $
для соответствия любой части текста и установки флага global
, в javascript/exp/g
Вы можете проверить Regex здесь