Регулярное выражение для мобильного номера телефона

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

Номера телефонов вводятся разными пользователями и в совершенно непредсказуемом формате, например могут участвовать -+()_ пробелы и еще не известно на что хватит фантазии.

Примеры телефонов:

8 900 000-00-00

+7 (900) 000 00-00

+7 9001112233

89001112233

8(900) 111-2233

и т.д

задан 5 сен 2017 в 14:51

Alexander Kiselev's user avatar

Alexander KiselevAlexander Kiselev

8101 золотой знак6 серебряных знаков12 бронзовых знаков

2

Как вариант:

/(?:+|d)[d-() ]{9,}d/g
  • Начинается с: «+» или цифры
  • Потом может содержать: цифры, «-«, «(«, «)», пробел. Повторяющиеся 9 и больше раз
  • Заканчивается цифрой

https://regex101.com/r/poJz8C/5

ответ дан 5 сен 2017 в 15:56

MedvedevDev's user avatar

MedvedevDevMedvedevDev

5,15910 серебряных знаков25 бронзовых знаков

Думаю, примерно так:

/(+7|8)[- _]*(?[- _]*(d{3}[- _]*)?([- _]*d){7}|dd[- _]*dd[- _]*)?([- _]*d){6})/g
console.log(
"8 900 000-00-00
+7 (900) 000 00-00
+7 9001112233
89001112233
8(900) 111-2233
8 (1234) 12 12 12
8 (12-34) 12 12 12
8  ( 123 )  412 12 12".match(
/(+7|8)[- _]*(?[- _]*(d{3}[- _]*)?([- _]*d){7}|dd[- _]*dd[- _]*)?([- _]*d){6})/g
))
.as-console-wrapper.as-console-wrapper { max-height: 100vh }

ответ дан 5 сен 2017 в 22:30

Qwertiy's user avatar

QwertiyQwertiy

119k24 золотых знака117 серебряных знаков287 бронзовых знаков

4

/(?:+|d)[d-() ]{9,}d/g так лучше

NTP's user avatar

NTP

3,1412 золотых знака21 серебряный знак41 бронзовый знак

ответ дан 23 июн 2018 в 21:17

Николай's user avatar

0

Небольшая доработка

(?<=^|s|>|;|:|))(?:+|7|8|9|()[d-() ]{8,}d

Первая группа смотрит вперед, но не попадает в выборку. Нужно, чтобы не срабатывало на параметры в ссылках и подобный мусор.

Второе — с чего начинается номер.

У меня это +, 7, 8, 9 (для сотовых) и с открывающейся скобки — иногда номер пишут начиная с кода города, опуская +7.

Spatz's user avatar

Spatz

4,30623 золотых знака21 серебряный знак24 бронзовых знака

ответ дан 21 окт 2021 в 9:16

Piconn's user avatar

[0-9| |-|(|)|+]{10,17}[0-9| |-|(|)]

Kromster's user avatar

Kromster

13.2k12 золотых знаков41 серебряный знак70 бронзовых знаков

ответ дан 14 янв 2019 в 4:16

дмитрий's user avatar

Простой и понятный вариант можете сами подобрать здесь https://regex101.com/
или вот такой:
/(^[7|8]{0,1}d{10}$)|(^+7{1}d{10}$)/ где
^ — это начало строки.
$ — это конец строки.
[7|8]{0,1} — 7 или 8 могут быть 1 раз или 0 раз.
d{10} — числа должны повторяться 10 раз.
| — знак или.
(^+7{1}d{10}$) — здесь аналогично

ответ дан 18 апр 2020 в 10:36

Максим_К's user avatar

1

33 самые полезные регулярки с примерами использования для быстрого решения наиболее распространенных задач веб-разработки.

33 самые полезные регулярки для веб-разработчика

Пользовательские данные

1. Юзернейм

Стандартный формат юзернейма – цифры, строчные буквы, символы - и _. Разумная длина – от 3 до 16 знаков. В зависимости от ваших конкретных потребностей вы можете изменять набор символов (например, разрешить символ *) и длину строки.

/^[a-z0-9_-]{3,16}$/

JS:

re.test('normal_login-123'); // true
re.test('IncorrectLogin'); // false
re.test('inc*rrect_l*gin'); // false

Что используем:
Символы ^ и $ указывают на начало и конец строки, так что введенный юзернейм будет проверен на совпадение полностью от первого до последнего символа.

2. Валидация email

Проверка адреса электронной почты на корректность – одна из самых частых задач веб-разработчика. Без этого не обходятся ни разнообразные формы подписки, ни авторизация.

Для валидации email существует множество различных регулярок. Вот одна из них – не самая большая и не самая сложная, но достаточно точная для быстрой проверки адреса:

/^[A-Z0-9._%+-]+@[A-Z0-9-]+.+.[A-Z]{2,4}$/i

JS:

re.test('correct-email@mail.com'); // true
re.test('CORRECT.email@mail123.com'); //true
re.test('incorrect-email@mail'); //false

Что используем:
Флаг i в регулярных выражений обеспечивает регистронезависимость сравнения.

3. Номер телефона

Проверяя номер телефона, обязательно учитывайте общепринятые форматы, так как в разных странах их принято записывать по-разному. Например, для американского стиля подойдет вот такая регулярка:

/^+?(d{1,3})?[- .]?(?(?:d{2,3}))?[- .]?ddd[- .]?dddd$/

JS:

re.test('(212) 348-2626'); // true
re.test('+1 832-393-1000'); // true
re.test('+1 202-456-11-11'); // false

Что используем:
Квантификатор ? соответствует одному предыдущему символу или его отсутствию.

4. Надёжность пароля

Часто встречаете на различных сервисах требование придумать сложный пароль? Кто и как определяет требуемую степень сложности? На самом деле, для этого есть некоторые стандарты: минимальная длина, разный регистр символов, наличие букв, цифр и специальных знаков.

Чтобы обеспечить ваших пользователей надежными паролями, можете воспользоваться вот таким выражением (или составить собственные регулярки со специфическими требованиями):

/^(?=.*[A-Z].*[A-Z])(?=.*[!@#$&*])(?=.*[0-9].*[0-9])(?=.*[a-z].*[a-z].*[a-z]).{8,}$/

JS:

re.test('qwerty'); // false
re.test('qwertyuiop'); // false
re.test('abcABC123$'); // true

Что используем:
Оператор ?= внутри скобочной группы позволяет искать совпадения «просматривая вперед» переданную строку и не включать найденный фрагмент в результирующий массив.

Подробнее о надежности паролей вы можете узнать из этого руководства.

5. Почтовый индекс (zip-code)

Формат почтового индекса, как и телефона, зависит от конкретного государства.

В России все просто: шесть цифр подряд без разделителей.

/^d{6}$/

Американский zip-code может состоять из 5 символов или в расширенном формате ZIP+4 – из 9.

/^d{5}(?:[-s]d{4})?$/

JS:

re.test('75457'); // true
re.test('98765-4321'); // true

Что используем:
Последовательность ?: внутри скобочной группы исключает ее из запоминания.

6. Номер кредитной карты

Разумеется, при проверке номера платежной карты не стоит полагаться на регулярные выражения. Однако с их помощью вы можете сразу же отсеять очевидно неподходящие последовательности и не нагружать сервер лишним запросом.

С помощью вот такой длинной регулярки вы можете поддерживать сразу несколько платежных систем:

/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35d{3})d{11})$/

Подробнее разобраться, откуда что взялось, вы можете здесь.

Что используем:
Вертикальная черта | в регулярных выражениях обозначает альтернацию, то есть выбор одного варианта из нескольких.

Распространенные форматы

7. Начальные и конечные пробелы

Пробелы в начале и конце строки обычно не несут никакой смысловой нагрузки, но могут повлиять на анализ и обработку данных, поэтому от них следует сразу же избавляться.

/^[ s]+|[ s]+$/g

JS:

let str = " hello ";
console.log(str.length); // 7
str = str.replace(re, '');
console.log(str.length); // 5

Что используем:
Квантификатор + соответствует инструкции {1,} – один и более символов.

8. Дата

С датами приходится работать очень часто, а форматов записи у них великое множество. Прежде чем начинать обработку, имеет смысл проверить, соответствует ли вид переданной строки требуемому.

Вот такое регулярное выражение поддерживает несколько форматов дат – с полными и краткими числами (5-1-91 и 05-01-1991) и разными разделителями (точка, прямой или обратный слеш).

/^(?:(?:31(/|-|.)(?:0?[13578]|1[02]))1|(?:(?:29|30)(/|-|.)(?:0?[1,3-9]|1[0-2])2))(?:(?:1[6-9]|[2-9]d)?d{2})$|^(?:29(/|-|.)0?23(?:(?:(?:1[6-9]|[2-9]d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1d|2[0-8])(/|-|.)(?:(?:0?[1-9])|(?:1[0-2]))4(?:(?:1[6-9]|[2-9]d)?d{2})$/

Здесь учитываются даже високосные годы!

JS:

re.test('29-02-2000'); // true
re.test('29-02-2001'); // false

Что используем:
Последовательности вида 1, 2 и так далее – это обратные ссылки на скобочные группы, определяющие вид разделителя. Благодаря им можно отсеять даты с разными разделителями:

re.test('10-10/2010'); // false

9. IPv4

Адрес IP используется для идентификации конкретного компьютера в интернете Он состоит из четырех групп цифр (байтов), разделенных точками (192.0.2.235).

/b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)b/

Что используем:
Класс b означает «границу слова» и имеет нулевую ширину (то есть это не отдельный символ).

10. IPv6

IPv6 – это новый, более сложный синтаксис IP-протокола. Выражение для проверки на этот формат выглядит куда страшнее, хотя на самом деле разница заключается только в поддержке шестнадцатеричных чисел:

(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]).){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]).){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))

11. Base64

Base64 – достаточно распространенный формат кодирования бинарных данных, который часто используется, например, в email-рассылках.

Для валидации строки в этом формате можно использовать следующее регулярное выражение:

^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$

12. ISBN

ISBN – международная номенклатура для печатных книг. Номер может состоять из 10 (ISBN-10) или 13 цифр (ISBN-13). На самих книгах ISBN обычно разделен дефисами на несколько групп (код страны, издательства и самой книги), но для проверки и использования их следует удалять.

Это регулярное выражение позволяет проверить оба формата сразу:

/b(?:ISBN(?:: ?| ))?((?:97[89])?d{9}[dx])b/i

JS:

re.test('ISBN 9781106998966'); // true
re.test('1106998966'); // true
re.test('110699896x'); // true

Числа

13. Проверка на число

Очень простая проверка строки на число с помощью регулярок:

/^d{1,}$/

JS:

re.test('13'); // true
re.test('23yy'); // false

14. Разделитель разрядов

Задача разбить большое число на разряды по три цифры встречается в разработке довольно часто. Оказывается это очень легко сделать с помощью регулярок.

/d{1,3}(?=(d{3})+(?!d))/g

JS:

'1234567890'.replace(re, '$&,'); // 1,234,567,890

Что используем:
Комбинация $& в строке замены позволяет подставить найденную комбинацию.

15. Цена

Цены могут быть представлены во множестве различных форматов. Универсального регулярного выражения для них, скорее всего, не существует, но цену в долларах из строки извлечь очень просто.

Эта регулярка предполагает, что для разделения разрядов числа используются запятые, а дробная часть отделена точкой:

/($[0-9,]+(.[0-9]{2})?)/

JS:

let price = 'price $5,555.55'.match(re)[0]; '$5,555.55

Что используем:
Комбинация {2} означает, что символ из диапазона [0-9] должен быть повторен ровно 2 раза (дробная часть цены).

Файлы и URL

16. Сопоставить строку URL

Если вам необходимо проверить, является ли полученная строка URL-адресом, вы можете воспользоваться вот такой регуляркой:

/[-a-zA-Z0-9@:%_+.~#?&/=]{2,256}.[a-z]{2,4}b(/[-a-zA-Z0-9@:%_+.~#?&/=]*)?/gi

Она подойдет для адресов с различными протоколами (HTTP, HTTPS, FTP) и даже без протокола.

JS:

re.test('https://yandex.ru'); // true
re.test('yandex.ru'); // true
re.test('hello world'); // false

17. Извлечение домена

В URL-адресе много частей: протокол, домен, поддомены, путь к странице и строка запроса. С помощью регулярок можно отбросить все лишнее и получить только домен:

/https?://(?:[-w]+.)?([-w]+).w+(?:.w+)?/?.*/i

JS:

let domain = 'https://proglib.io'.match(re);
console.log(domain[1]); // proglib

Что используем:
Метод match возвращает объект с данными совпадения. Под индексом 1 в нем хранится совпадение, соответствующее первой скобочной группе.

18. Расширения

Одна строчка регулярного выражения позволяет быстро и просто получить расширение файла, с которым вам предстоит работать:

/^(?:.*.(?=(htm|html|class|js)$))?[^.]*$/i

JS:

let file1 = 'script.js'.match(re)[1]; // js
let file2 = 'hello'.match(re) [1]; // undefined

Разумеется, при необходимости сюда можно добавлять другие расширения.

19. Протокол

Иногда требуется извлечь протокол полученной ссылки. Регулярные выражения и тут облегчают жизнь:

/^([a-zA-Z]+):///

JS:

let protocol = 'https://proglib.io/'.match(re)[0]; // https

Социальные сети

20. Twitter

Имя пользователя Twitter:

/@([A-Za-z0-9_]{1,15})/

21. Facebook

URL аккаунта на Facebook:

/(?:http://)?(?:www.)?facebook.com/(?:(?:w)*#!/)?(?:pages/)?(?:[w-]*/)*([w-]*)/

22. YouTube

Получение ID видео на YouTube:

/https://(?:youtu.be/|(?:[a-z]{2,3}.)?youtube.com/watch(?:?|#!)v=)([w-]{11}).*/gi

JS:

re.exec('https://www.youtube.com/watch?v=JbgvaQ_rM4I')[1]; // JbgvaQ_rM4I

Что используем:
Метод exec объекта регулярного выражения работает почти так же, как метод match строки.

HTML и CSS

23. HEX-цвета

Веб-разработчику часто приходится иметь дело с цветами, заданными в шестнадцатеричном формате. Регулярки позволяют легко извлекать такие цвета из строки:

/#([a-fA-F]|[0-9]){3, 6}/

Крутой рецепт, правда? :)

24. Адрес изображения

Для получения адреса изображения обычно используется DOM-метод img.getAttribute('src'). Регулярки для этого применяются редко, но полезно все же знать их возможности:

/< *[img][^>]*[src] *= *["']{0,1}([^"' >]*)/

JS:

re.exec('<img src="image.png" alt="image1">')[1]; // image.png

25. CSS-свойства

Еще одна нетривиальная ситуация – получение свойств CSS с помощью регулярных выражений:

/s*[a-zA-Z-]+s*[:]{1}s[a-zA-Z0-9s.#]+[;]{1}/gm

JS:

let css = ` .element {
color: white;
background: black;
font-size: 16px;
}`
css.match(re);

Что используем:
Флаг m в регулярных выражениях включает многострочный режим.

26. HTML комментарии

А это очень полезная регулярка для удаления комментариев из HTML-кода:

/<!--(.*?)-->/

Что используем?
Символ ?, стоящий в регулярном выражении после другого квантификатора, переводит его в ленивый режим.

27. Title

Получить заголовок веб-страницы можно с помощью такого регулярного выражения:

/<title>([^<>]*?)</title>/

28. rel=«nofollow»

Важная SEO-задача, которую очень не хочется делать вручную, – добавление внешним ссылкам атрибута rel="nofollow". Обратимся к регулярным выражениям:

PHP:

$html = '<a href="https://site.com">site.com</a>,
      <a href="my-site.com">my-site.com</a>,
      <a href="https://site.com" rel="nofollow">site.com</a>';
$re = '/(<as*(?![^>]*brel=)([^>]*bhref="https?://[^"]+"))/';
$result = preg_replace($re, '$1 rel="nofollow"', $html);

Эта регулярка выбирает в тексте все ссылки с протоколом http/https без атрибута rel и добавляет его.

29. Медиа запросы

Если требуется проанализировать медиа-запросы CSS, воспользуйтесь этой регуляркой:

/@media([^{]+){([sS]+?})s*}/g

Что используем:
Класс s обозначает пробельный символ (а также таб и перевод строки), а класс S – наоборот, любой символ кроме пробельного.

30. Подсветка слов

Полезное выражение для поиска и выделения слов в тексте:

/b(ipsum)b/ig

JS:

let text = 'Lorem ipsum dolor, lorem ipsum dolor.';
text.replace(re, '<span style="background: yellow">$&</span>')

PHP:

$re = '/b(ipsum)b/i';
$text = 'Lorem ipsum dolor, lorem ipsum dolor.';
preg_replace($re, '<span style="background:#5fc9f6">1</span>', $text);

Разумеется, слово ipsum можно заменить на любое другое слово или словосочетание

Другие задачи веб-разработчика

31. Проверка версии Internet Explorer

К счастью, старый добрый IE постепенно уходит в прошлое, но он все же еще играет некоторую роль в современном вебе. Этот фрагмент кода позволяет определить версию всеми любимого браузера:

/^.*MSIE [5-8](?:.[0-9]+)?(?!.*Trident/[5-9].0).*$/

32. Удалить повторы

Регулярки дают возможность автоматически удалить случайные повторы слов без проглядывания всего текста:

/(w+)s+1/gi

JS:

"hello world world hello".replace(re, "$1") // hello world hello

33. Количество слов

Порой веб-разработчику необходимо определить количество слов в строке, например, для организации ключевых слов в инструментах аналитики. Сделать это можно с помощью следующих регулярок:

^[^s]*$ &nbsp; // ровно одно слово
^[^s]*s[^s]*$ // ровно два слова
^[^s]*s[^s]* // два слова и больше
^([^s]*s){2}[^s]*$ // ровно три слова
^([^s]*s){4, }[^s]*$ // пять слов и больше
Свои любимые регулярки пишите в комментариях :)

Полезные статьи по регулярным выражениям

  • 5 практических примеров использования регулярных выражений на JavaScript
  • Практическое введение в регулярные выражения для новичков
  • 11 материалов по регулярным выражениям
  • Регулярные выражения: 5 сервисов для тестирования и отладки

Регулярные выражения или, как его обычно называют, RegEx — это любая последовательность символов, которая может использоваться в качестве шаблона для поиска символов или строк.

Например, чтобы определить, содержит ли строка или фраза слово «яблоко», мы можем использовать регулярное выражение /яблоко для поиска в строке. В качестве другого примера мы можем использовать /[0-9], чтобы проверить, содержит ли данная строка число от 0 до 9.

Регулярные выражения и их использование

Регулярные выражения широко используются для различных целей в современных веб-операциях. Проверка веб-форм, поисковые системы, лексические анализаторы в IDE, текстовые редакторы и редакторы документов — вот лишь несколько примеров, в которых часто используются регулярные выражения.

Мы все использовали CTRL + F много раз для поиска в документе или фрагменте кода, чтобы найти определенное слово, фразу или выражение. Эту операцию можно назвать очень распространенным примером использования регулярных выражений.

Прежде чем продолжить, давайте взглянем на очень часто используемое регулярное выражение.

Можете ли вы догадаться приведенный ниже RegEX, для чего он используется?

^([a-zA-Z0-9_-.]+)@([a-zA-Z0-9_-.]+).([a-zA-Z]{2,5})$

Не волнуйтесь, если не можете угадать. Я уверен, что вы сможете догадаться к концу этой статьи.

Токены

Для начала давайте посмотрим на различные символы в показанном выше регулярном выражении

^([a-zA-Z0-9_-.]+)@([a-zA-Z0-9_-.]+).([a-zA-Z]{2,5})$

Если мы посмотрим на приведенное выше регулярное выражение, мы увидим, что оно состоит из множества символов или токенов. Давайте узнаем, что они означают:

Токен Значение
^ Этот токен обозначает начало строки.
(…) Обозначает группу, в которой фиксируется все, что дано в (…).
[…] [] Включает символы, любой из которых может быть сопоставлен. Например — [abc] будет соответствовать либо a, либо b, либо c.
a-z Набор букв от a до z. Мы должны помнить, что Regex чувствителен к регистру.
A-Z Набор заглавных букв от A до Z.
0-9 Цифры от 0 до 9.
_ Это будет соответствовать символу _.
Экранирование символов.
. Соответствует символу «.» (точка). Его используется потому, что символ «.» в регулярном выражении — это сам по себе токен, который соответствует любому символу
+ Количественный показатель, соответствует одному или нескольким символам, с которыми он используется. Например, «a+» означает одно или несколько вхождений символа «а» .
- Будет соответствовать символу «-».
@ Будет соответствовать символу «@».
{} Это еще один количественный показатель. Он используется для обозначения количества вхождений символа. Например, a{3} означает ровно три «a».
$ Означает конец строки.

Разбивка данного шаблона регулярных выражений

Теперь, вооружившись этой таблицей, давайте попробуем декодировать указанное выше регулярное выражение:

^([a-zA-Z0-9_-.]+) означает, что мы ищем строку, которая начинается как минимум с одного или нескольких буквенно-цифровых символов верхнего или нижнего регистра, знаков подчеркивания, дефисов или точек. Например, все, что похоже на user_name.01, будет соответствовать шаблону. Мы должны помнить, что здесь нет необходимости включать все символы, достаточно одного символа [a-zA-Z0-9_-.].

Символ @ соответствует единственному вхождению @. Добавляя к предыдущему примеру, подойдет что-то вроде user_name.01@.

([a-zA-Z0-9_-.]+) аналогичен первому пункту. Это также означает, что мы ищем строку, содержащую хотя бы один или несколько буквенно-цифровых символов, подчеркиваний, дефисов или точек. Например: user_name.01@gmail

Как вы уже догадались, мы намекаем на шаблон электронной почты. Двигаясь дальше, . соответствует символу точки «.». Если мы продолжим текущий пример, получится что-то вроде user_name.01@gmail.

([a-zA-Z]{2,5})$ означает, что строка должна заканчиваться от 2 до 5 букв алфавита в верхнем или нижнем регистре. Если мы добавим .com к предыдущему примеру, мы можем получить user_name.01@gmail.com, что является общим шаблоном строки электронной почты.

Объединив все вышеперечисленное, мы видим, что ищем строку идентификатора электронной почты. Теперь мы можем использовать это выражение для проверки любого идентификатора электронной почты.

PS. — Это шаблон для наиболее распространенных идентификаторов электронной почты в Интернете.

Типы токенов

Многие токены могут использоваться в различных комбинациях в регулярном выражении для описания широкого спектра выражений. Ниже мы рассмотрим различные типы токенов, которые используются в регулярных выражениях. Кроме того, мы также рассмотрим наиболее часто используемые токены в каждой категории.

Базовые токены

Начнем с основных токенов. Эти токены используются почти во всех регулярных выражениях. Следовательно, мы должны сначала узнать о них.

Токен Значение
r Соответствует символу возврата каретки (перевода строки).
Соответствует нулевому символу.
n Ищет новую строку.
t Соответствует табуляции (Tab).

Классы символов

Двигаясь дальше, давайте посмотрим на токены символов. Они используются для сопоставления алфавитов, чисел и других специальных символов.

Токен Значение
a Буквально соответствует символу a. Точно так же все буквы и числа, когда используются отдельно, ищет конкретный символ.
abc Соответствует строке abc.
[abc] Это ищет один символ среди a, b или c.
[^abc] Соответствует любому символу, кроме a, b или c.
[a-z] Строчный символ в диапазоне от a до z
[^a-z] Любой символ не в диапазоне от a до z. Сюда также входят символы верхнего регистра.
[A-Z] Символ верхнего регистра между A и Z.
[^A-Z] Любой символ не в диапазоне от A до Z.
[0-9] Любое число от 0 до 9
[^0-9] Символ вне диапазона от 0 до 9
[a-zA-Z0-9] Соответствует символу, который может быть символом нижнего регистра от a до z или любым символом от A до Z или любым числом от 0 до 9.
[^a-zA-Z0-9] Любой символ, не попадающий в предыдущую категорию.
. Любой одиночный символ.
s Используется для поиска пробельных символов.
S Используется для поиска не пробельных символов.
d Соответствует любой цифре
D Не соответствует цифре
w Буквенный или цифровой символ или знак подчёркивания
W Любой символ, кроме буквенного или цифрового символа или знака подчёркивания
$ Означает конец строки
b Соответствует границе слова
B Используется для сопоставления границы, отличной от слова

Квантификаторы

Этот специальный класс токенов используется для сопоставления количества последовательных вхождений символа, строки или числа. Они используются вместе с другими токенами.

Давайте посмотрим на несколько распространенных кванторов.

Токен Значение
a? Соответствует нулю или одному вхождению.
a* Соответствует нулю или более вхождений (подряд) a.
a+ Для одного или нескольких последовательных вхождений a.
a{5} Ищет ровно пять последовательных вхождений буквы a.
a{5, } Как минимум для пяти или более последовательных вхождений a.
a{5, 7} Ищет любое количество последовательных a от 5 до 7.

Группы

Эти токены, как следует из названия, будут совпадать в группах.

Токен Значение
(…) Захватывает все, что заключено в круглые скобки.
(a|b) Соответствует либо a, либо b.
(?:…) Соответствует всему, что заключено в квадратные скобки
(?(1)yes|no) Соответствует условному выражению.

Флаги

Это специальные инструкции, которые даются механизму сопоставления шаблонов при поиске совпадения.

Токен Значение
g Глобальный поиск. Будет искать до тех пор, пока не найдет больше совпадений, то есть до конца данной строки или группы строк.
m Многострочное соответствие, т. Е. Строка за строкой.
x Указывает движку игнорировать пробелы при сопоставлении.
X Используется для расширенного сопоставления.
s Соответствует одной строке.
i Используется для сопоставления без учета регистра.
u Для символов Юникода.

Якоря

Дополнительные инструкции для движка.

Токен Значение
^ Обозначает начало строки
A Тоже означает начало строки
Z Маркер конца строки.
z Токен для абсолютного конца строки.
G Начало поиска.

Часто используемые регулярные выражения

Регулярные выражения широко используются в Интернете. Регулярные выражения практически неотделимы от современных вычислительных приложений, от проверки форм до поиска данных, содержащих определенное ключевое слово или ключевые слова.

Давайте посмотрим на несколько знакомых примеров использования регулярных выражений.

Соответствие номера телефона

Давайте посмотрим, каков образец телефонного номера, используемого например в Индии. Код страны идет первым. Обычно он содержит символ «+», за которым следует число 91, которое является кодом страны для Индии. Кроме того, номера телефонов в Индии обычно начинаются с 6, 7, 8 или 9. За ними следуют еще 9 цифр.

Таким образом, действительное регулярное выражение для индийского номера мобильного телефона будет таким:

^(+91[-s]?)?[0]?(91)?[6-9]d{9}$

Проверка надежности паролей

Большинство веб-сайтов рекомендуют нам предоставить надежный пароль, который содержит комбинацию цифр, прописных и строчных букв и символов. Также должно быть минимальное количество символов — 6 или 8. Это сделано для того, чтобы пароль было очень сложно взломать.

Любой пароль, соответствующий этому правилу, может быть сгенерирован или подтвержден на надежность пароля с помощью регулярного выражения.

^(((?=.*[a-z])(?=.*[A-Z]))|((?=.*[a-z])(?=.*[0-9]))|((?=.*[A-Z])(?=.*[0-9])))(?=.{6,})

Соответствие URL

URL-адреса — это наиболее распространенный способ использования Интернета и быстрого перехода на нужную веб-страницу. Почти у каждого веб-сайта есть URL-адрес. Следовательно, каждый URL-адрес стандартизирован и следует определенному шаблону. Каждый URL следует либо по протоколу HTTP, либо по протоколу HTTP, за которым часто следует « : // » и « www ». Затем название веб-сайта, за которым следует .com, .ru, .net, .org и т. д.

Чтобы проверить правильность URL-адреса, мы можем использовать регулярное выражение, подобное приведенному ниже.

https?://(www.)?[-a-zA-Z0-9@:%._+~#=]{1,256}.[a-zA-Z0-9()]{1,6}b([-a-zA-Z0-9()@:%_+.~#?&//=]*)

Форматы даты и времени

Форматы даты и времени также очень часто используются в Интернете. Есть много форматов дат, используемых в различных приложениях, программном обеспечении или системах. Даты всегда следует использовать в формате, позволяющем использовать их для пользователя или приложения, которое пытается их прочитать.

Дата в формате дд-ММ-гггг может быть проверена с помощью регулярного выражения, которое может быть таким, как указано ниже.

^(1[0-2]|0[1-9])/(3[01]|[12][0-9]|0[1-9])/[0-9]{4}$

Также рекомендуем прочитать:

  1. Самые полезные расширения VS Code для повышения производительности
  2. Как добавить темную тему на свой сайт с помощью CSS и JavaScript
  3. 10 лучших шрифтов для программирования, которые нужны разработчикам
  4. 8 шагов, как получить 100 звезд и больше на GitHub

Такая элементарная вещь, как номер телефона, в письменных текстах живёт во множестве вариантов. Обыкновенный номер типа +7 (123) 123-45-67 можно встретить записанным без скобок или дефисов (+7 123 1234567), а то и вообще без пробелов (+71231234567). Не собираюсь оскорблять чувства пишущих, им и так непросто. Но уважающий себя веб-ресурс не может допустить такой типографической разношёрстности. Плюс к тому, необлагороженные номера неудобно читать человеку (то самое human-readable).

Данная статья о том, как привести все телефонные номера на странице к однообразному виду, а также проставить корректные ссылки типа tel: на них. Для решения поставленной задачи используются регулярные выражения JavaScript. Хороший обзор регэкспов дан здесь, также почитать по теме можно на MDN.

В качестве эталонной будет принята запись номера вида +7 (123) 123-45-67.

Найти все телефонные номера на странице можно таким способом:

  let pattern = new RegExp('(+7|8)[s(]*d{3}[)s]*d{3}[s-]?d{2}[s-]?d{2}', 'g');    // создать регулярное выражение
  let phoneNumbers = document.body.innerText.match(pattern);    // применить на всём тексте документа

Метод match() вернёт и запишет в переменную phoneNumbers массив (объект типа Array) со всеми найденными на странице номерами.

Дисклеймер. Виденное выше регулярное выражение может вызвать сильное чувство боли в глазах у неподготовленного читателя. Если вы не очень знакомы с регулярками, автор всё-таки советует для начала проработать несколько первых глав учебника на LearnJavascript.

Разберём это выражение:

(+7|8) +7 (123) 123-45-67

На практике встречается начало и с 8, и с +7.

Напомню: | означает или. То есть, на данной позиции паттерна может стоять любой из вариантов, разделённых |. Также важно не забыть поставить скобки :))

[s(]*d{3}[)s]* +7 (123) 123-45-67
[s(]* +7 (123) 123-45-67

То есть, фактически, эти части паттерна распознают первые три цифры после кода страны, причём как взятые в скобки, так и без (квантификатор * синонимичен {0,} и означает «либо ноль, либо сколько угодно»).

Также напомню: d stands for символьная группа всех цифр (всё равно что [0-9]), s — группа всех пробельных символов.

d{3}[s-]?d{2}[s-]?d{2} +7 (123) 123-45-67
[s-]? +7 (123) 1234567

Данная часть паттерна распознаёт последние 7 цифр номера. Они могут быть разделены дефисами, пробелами или вообще ничем.
Напоминалка: квантификатор ? синонимичен {0,1} и означает «либо одно вхождение, либо ничего»).

Наверное, уже нет смысла пояснять, что цифра, взятая в фигурные скобки {}, означает точное количество повторений данного символа/группы в шаблоне.

Ну хорошо, найти все номера получилось. К сожалению, задача этим не исчерпывается. Как же взять и заменить все вхождения разом?

Здесь поможет метод replace(). Если у регулярного выражения указан флаг 'g' (второй аргумент конструктора), то replace() заменит все вхождения на то, что указано. Например, задача замены всех повторяющихся пробелов в тексте на одинарные решается таким простым способом:

  text = text.replace(/s{1,}/g, ' ');

На всякий: /s{1,}/g — это краткая запись для new RegExp('s+', 'g'). Также вместо {1,} можно писать просто +.

Но ведь у нас задача сложнее: нельзя же заменить разные номера телефонов на один! Тут самое время вспомнить о скобочных группах.

Скобочная группа — термин из теории регулярных выражений. Технически это просто часть паттерна, взятая в скобки. Но к любой такой группе можно обратиться по индексу.

Получается,

К счастью, replace() поддерживает работу с группами. Достаточно написать в шаблоне замены (второй параметр) ${номер_группы} ($1 или $5), и функция заменит эту конструкцию на содержимое скобочной группы.

То была идея, а теперь реализация:

  let pattern = /(+7|8)[s(]?(d{3})[s)]?(d{3})[s-]?(d{2})[s-]?(d{2})/g;    // паттерн с проставленными скобками
  let phoneNumbers = document.body.innerText.match(pattern);    // найдём все номера
  let correctNumber = phoneNumbers[0].replace(pattern, '+7 ($2) $3-$4-$5');    // пробуем замену
  console.log(correctNumber);

В результате будет выведен аккуратный, каноничный телефонный номер. Работает!

Теперь, чтобы заменить все найденные номера телефонов на единообразные, добавим флаг g:

  let pattern = /(+7|8)[s(]?(d{3})[s)]?(d{3})[s-]?(d{2})[s-]?(d{2})/g;
  document.body.innerHTML = document.body.innerHTML.replace(pattern, '+7 ($2) $3-$4-$5');

Усложним шаблон функции replace(), чтобы номер телефона был кликабельным (ссылка с префиксом tel:):

  let pattern = /(+7|8)[s(]?(d{3})[s)]?(d{3})[s-]?(d{2})[s-]?(d{2})/g;
  document.body.innerHTML = document.body.innerHTML.replace(pattern, '<a href="tel:+7$2$3$4$5">+7 ($2) $3-$4-$5</a>');

То есть, для корректной работы ссылки нужно в её коде выписать все цифры номера подряд — как раз самый неудобный для чтения человеком вариант.

Понравилась статья? Поделить с друзьями:
  • Регулярное выражение для валидации номера телефона
  • Регистратура уваровичи поликлиника номер телефона
  • Регистратура црб красный сулин номер телефона депутатская
  • Регулярка для номеров телефонов
  • Регистратура ува црб номер телефона