^ (\ (? \ D {3} \)?) ([.-]) (\ d {3}) ([.-] ) (\ d {4}) $
Это должно соответствовать всем шаблонам, кроме последнего.
Для последнего вы можете использовать разделенный шаблон ^ \ d {10} $
И есть ошибка, он будет соответствовать (123 456 7899
^ (\ (? \ d {3} \)?)
, если мы нарушим этот код, первый символ ( ^
) совпадает с началом текста. \ (?
and \)?
будет принимать или не принимать этот символ, существует проблема, с которой вы должны проверить, есть ли там был открывающим символом, если бы второе должно было совпадать, я не знаю, возможно ли это с использованием только Regex. И \ d {3}
будет соответствовать трем числам
([.- ])
будет соответствовать любому из них, но только одному и только один раз.
(\ d {3})
будет соответствовать трем числам
То же, что 2
(\ d {4}) $
четырем числам, за которыми следует конец текста ( $
)
Поскольку вы хотите извлечь из HTML-страницы, вам придется игнорировать ^
и $
, чтобы сопоставить любую часть текста, и установить флаг ] global
, в javascript / exp / g
Вы можете протестировать Regex здесь
/^[\.-)( ]*([0-9]{3})[\.-)( ]*([0-9]{3})[\.-)( ]*([0-9]{4})$/
Должно получиться то, что вы пытаетесь сделать.
Первая часть ^
означает "начало строки", что заставит его учитывать всю строку.
Части [\.-)( ]*
, которые у меня там есть, означают "любая точка, дефис, скобка или пробел, встречающиеся 0 или более раз".
Кластеры ([0-9]{3})
соответствуют группе из 3 чисел (последний установлен на соответствие 4)
Надеюсь, это поможет!
Не зная, какой язык вы используете, я не уверен в правильности синтаксиса.
Это должно соответствовать всем вашим группам с очень малым количеством ложных срабатываний:
/\(?([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/"
Вот ложные срабатывания моего выражения:
Разбиение выражения на две части, одна из которых совпадает со скобками, а другая нет, устранит все ложные срабатывания, кроме первого:
/\(([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.
Это поможет вам поймать те, у которых код города указан в скобках
([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
, я должен был избежать { }
для повторения. Вы можете этого не делать, или вам придется экранировать другие символы, в зависимости от того, где вы собираетесь это использовать.