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

Возможные дубликаты:
Полное регулярное выражение для проверки номера телефона
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 здесь