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

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

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

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

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

enter image description hereThis solution actually validates the numbers and the format. For example: 123-456-7890 is a valid format but is NOT a valid US number and this answer bears that out where others here do not.


If you do not want the extension capability remove the following including the parenthesis:
(?:s*(?:#|x.?|ext.?|extension)s*(d+)s*)? :)

edit (addendum) I needed this in a client side only application so I converted it. Here it is for the javascript folks:

var myPhoneRegex = /(?:(?:+?1s*(?:[.-]s*)?)?(?:(s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]‌​)s*)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))s*(?:[.-]s*)?)([2-9]1[02-9]‌​|[2-9][02-9]1|[2-9][02-9]{2})s*(?:[.-]s*)?([0-9]{4})s*(?:s*(?:#|x.?|ext.?|extension)s*(d+)s*)?$/i;
if (myPhoneRegex.test(phoneVar)) {
    // Successful match
} else {
    // Match attempt failed
}

hth.
end edit

This allows extensions or not and works with .NET

(?:(?:+?1s*(?:[.-]s*)?)?(?:(s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]‌​)s*)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))s*(?:[.-]s*)?)([2-9]1[02-9]‌​|[2-9][02-9]1|[2-9][02-9]{2})s*(?:[.-]s*)?([0-9]{4})(?:s*(?:#|x.?|ext.?|extension)s*(d+))?$

To validate with or without trailing spaces. Perhaps when using .NET validators and trimming server side use this slightly different regex:

(?:(?:+?1s*(?:[.-]s*)?)?(?:(s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]‌​)s*)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))s*(?:[.-]s*)?)([2-9]1[02-9]‌​|[2-9][02-9]1|[2-9][02-9]{2})s*(?:[.-]s*)?([0-9]{4})s*(?:s*(?:#|x.?|ext.?|extension)s*(d+)s*)?$

All valid:

1 800 5551212

800 555 1212

8005551212

18005551212

+1800 555 1212 extension65432

800 5551212 ext3333

Invalid #s

234-911-5678

314-159-2653

123-234-5678


EDIT: Based on Felipe’s comment I have updated this for international.

Based on what I could find out from here and here regarding valid global numbers

This is tested as a first line of defense of course. An overarching element of the international number is that it is no longer than 15 characters. I did not write a replace for all the non digits and sum the result. It should be done for completeness. Also, you may notice that I have not combined the North America regex with this one. The reason is that this international regex will match North American numbers, however, it will also accept known invalid # such as +1 234-911-5678. For more accurate results you should separate them as well.

Pauses and other dialing instruments are not mentioned and therefore invalid per E.164

(?+[0-9]{1,3})? ?-?[0-9]{1,3} ?-?[0-9]{3,5} ?-?[0-9]{4}( ?-?[0-9]{3})?

With 1-10 letter word for extension and 1-6 digit extension:

(?+[0-9]{1,3})? ?-?[0-9]{1,3} ?-?[0-9]{3,5} ?-?[0-9]{4}( ?-?[0-9]{3})? ?(w{1,10}s?d{1,6})?

Valid International: Country name for ref its not a match.

+55 11 99999-5555 Brazil

+593 7 282-3889 Ecuador

(+44) 0848 9123 456 UK

+1 284 852 5500 BVI

+1 345 9490088 Grand Cayman

+32 2 702-9200 Belgium

+65 6511 9266 Asia Pacific

+86 21 2230 1000 Shanghai

+9124 4723300 India

+821012345678 South Korea

And for your extension pleasure

+55 11 99999-5555 ramal 123 Brazil

+55 11 99999-5555 foo786544 Brazil

Enjoy

enter image description hereThis solution actually validates the numbers and the format. For example: 123-456-7890 is a valid format but is NOT a valid US number and this answer bears that out where others here do not.


If you do not want the extension capability remove the following including the parenthesis:
(?:s*(?:#|x.?|ext.?|extension)s*(d+)s*)? :)

edit (addendum) I needed this in a client side only application so I converted it. Here it is for the javascript folks:

var myPhoneRegex = /(?:(?:+?1s*(?:[.-]s*)?)?(?:(s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]‌​)s*)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))s*(?:[.-]s*)?)([2-9]1[02-9]‌​|[2-9][02-9]1|[2-9][02-9]{2})s*(?:[.-]s*)?([0-9]{4})s*(?:s*(?:#|x.?|ext.?|extension)s*(d+)s*)?$/i;
if (myPhoneRegex.test(phoneVar)) {
    // Successful match
} else {
    // Match attempt failed
}

hth.
end edit

This allows extensions or not and works with .NET

(?:(?:+?1s*(?:[.-]s*)?)?(?:(s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]‌​)s*)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))s*(?:[.-]s*)?)([2-9]1[02-9]‌​|[2-9][02-9]1|[2-9][02-9]{2})s*(?:[.-]s*)?([0-9]{4})(?:s*(?:#|x.?|ext.?|extension)s*(d+))?$

To validate with or without trailing spaces. Perhaps when using .NET validators and trimming server side use this slightly different regex:

(?:(?:+?1s*(?:[.-]s*)?)?(?:(s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]‌​)s*)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))s*(?:[.-]s*)?)([2-9]1[02-9]‌​|[2-9][02-9]1|[2-9][02-9]{2})s*(?:[.-]s*)?([0-9]{4})s*(?:s*(?:#|x.?|ext.?|extension)s*(d+)s*)?$

All valid:

1 800 5551212

800 555 1212

8005551212

18005551212

+1800 555 1212 extension65432

800 5551212 ext3333

Invalid #s

234-911-5678

314-159-2653

123-234-5678


EDIT: Based on Felipe’s comment I have updated this for international.

Based on what I could find out from here and here regarding valid global numbers

This is tested as a first line of defense of course. An overarching element of the international number is that it is no longer than 15 characters. I did not write a replace for all the non digits and sum the result. It should be done for completeness. Also, you may notice that I have not combined the North America regex with this one. The reason is that this international regex will match North American numbers, however, it will also accept known invalid # such as +1 234-911-5678. For more accurate results you should separate them as well.

Pauses and other dialing instruments are not mentioned and therefore invalid per E.164

(?+[0-9]{1,3})? ?-?[0-9]{1,3} ?-?[0-9]{3,5} ?-?[0-9]{4}( ?-?[0-9]{3})?

With 1-10 letter word for extension and 1-6 digit extension:

(?+[0-9]{1,3})? ?-?[0-9]{1,3} ?-?[0-9]{3,5} ?-?[0-9]{4}( ?-?[0-9]{3})? ?(w{1,10}s?d{1,6})?

Valid International: Country name for ref its not a match.

+55 11 99999-5555 Brazil

+593 7 282-3889 Ecuador

(+44) 0848 9123 456 UK

+1 284 852 5500 BVI

+1 345 9490088 Grand Cayman

+32 2 702-9200 Belgium

+65 6511 9266 Asia Pacific

+86 21 2230 1000 Shanghai

+9124 4723300 India

+821012345678 South Korea

And for your extension pleasure

+55 11 99999-5555 ramal 123 Brazil

+55 11 99999-5555 foo786544 Brazil

Enjoy

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 сервисов для тестирования и отладки

Without knowing what language you’re using I am unsure whether or not the syntax is correct.

This should match all of your groups with very few false positives:

/(?([0-9]{3}))?([ .-]?)([0-9]{3})2([0-9]{4})/

The groups you will be interested in after the match are groups 1, 3, and 4. Group 2 exists only to make sure the first and second separator characters , ., or - are the same.

For example a sed command to strip the characters and leave phone numbers in the form 123456789:

sed "s/({0,1}([0-9]{3})){0,1}([ .-]{0,1})([0-9]{3})2([0-9]{4})/134/"

Here are the false positives of my expression:

  • (123)456789
  • (123456789
  • (123 456 789
  • (123.456.789
  • (123-456-789
  • 123)456789
  • 123) 456 789
  • 123).456.789
  • 123)-456-789

Breaking up the expression into two parts, one that matches with parenthesis and one that does not will eliminate all of these false positives except for the first one:

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

Groups 1, 3, and 4 or 5, 7, and 8 would matter in this case.

Without knowing what language you’re using I am unsure whether or not the syntax is correct.

This should match all of your groups with very few false positives:

/(?([0-9]{3}))?([ .-]?)([0-9]{3})2([0-9]{4})/

The groups you will be interested in after the match are groups 1, 3, and 4. Group 2 exists only to make sure the first and second separator characters , ., or - are the same.

For example a sed command to strip the characters and leave phone numbers in the form 123456789:

sed "s/({0,1}([0-9]{3})){0,1}([ .-]{0,1})([0-9]{3})2([0-9]{4})/134/"

Here are the false positives of my expression:

  • (123)456789
  • (123456789
  • (123 456 789
  • (123.456.789
  • (123-456-789
  • 123)456789
  • 123) 456 789
  • 123).456.789
  • 123)-456-789

Breaking up the expression into two parts, one that matches with parenthesis and one that does not will eliminate all of these false positives except for the first one:

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

Groups 1, 3, and 4 or 5, 7, and 8 would matter in this case.

Регулярные выражения или, как его обычно называют, 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

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