Регулярные выражения (regex или regexp) — незаменимый инструмент для извлечения информации из текста. Они применяются для поиска, извлечения, замены текста, а также проверки данных.
Регулярные выражения в основном универсальны для всех языков программирования.
Ниже мы собрали некоторые регулярные выражения, которые используем сами. Проверяйте их с помощью сайта regex101.com
Пользовательские данные
Имя пользователя
Существует много вариантов проверить имя пользователя. В примере ниже допустимы цифры, строчные буквы, символы — и _, длина от 3 до 15 знаков.
/^[a-z0-9_-]{3,15}$/
// JS
re.test('username-123'); // true
re.test('WrongLogin'); // false
re.test('wr*ong_l*gin'); // false
/^[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
Номер телефона
/^\+?(\d{1,3})?[- .]?\(?(?:\d{2,3})\)?[- .]?\d\d\d[- .]?\d\d\d\d$/
// JS
re.test('(212) 348-2626'); // true
re.test('+1 832-393-1000'); // true
re.test('+1 202-456-11-11'); // false
Надёжность пароля
/^(?=.*[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
Почтовый индекс (zip-code)
/^\d{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|35\d{3})\d{11})$/
Хештеги
/\B#([a-z0-9]{2,})(?![~!@#$%^&*()=+_`\-\|/'\[\]\{\}]|[?.,]*\w)/ig
Распространенные форматы данных
Начальные и конечные пробелы
/^[ \s]+|[ \s]+$/g
// JS
let str = " hello ";
console.log(str.length); // 7
str = str.replace(re, '');
console.log(str.length); // 5
Дата
/^(?:(?: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?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|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
IPv4
/\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/
IPv6
(([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]))
Base64
^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$
MD5
/^[a-f0-9]{32}$/gm
ISBN
ISBN – международная номенклатура для печатных книг. Номер может состоять из 10 (ISBN-10) или 13 цифр (ISBN-13). На самих книгах ISBN обычно разделен дефисами на несколько групп (код страны, издательства и самой книги), но для проверки и использования их следует удалять.
^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$
Кадастровый номер
/\d{2}:\d{2}:\d{6,7}:\d*/gm
Числа
Проверка на число
/^\d{1,}$/
Разделитель разрядов
/\d{1,3}(?=(\d{3})+(?!\d))/g
// JS
'1234567890'.replace(re, '$&,'); // 1,234,567,890
Файлы и URL
Проверка строки URL
/[-a-zA-Z0-9@:%_\+.~#?&\/=]{2,256}\.[a-z]{2,4}\b(\/[-a-zA-Z0-9@:%_\+.~#?&\/=]*)?/gi
// JS
re.test('https://yandex.ru'); // true
re.test('yandex.ru'); // true
re.test('hello world'); // false
Извлечение домена
/https?:\/\/(?:[-\w]+\.)?([-\w]+)\.\w+(?:\.\w+)?\/?.*/i
// JS
let domain = 'https://reklamafia.com'.match(re);
console.log(domain[1]); // reklamafia
Протокол
/^([a-zA-Z]+):\/\//
// JS
let protocol = 'https://reklamafia.com/'.match(re)[0]; // https
HTML и CSS
HEX-цвета
/\#([a-fA-F]|[0-9]){3, 6}/
Удалить комментарии из HTML
//
Title
/([^<>]*?) /
rel=«nofollow»
Интересный пример: выбираем в тексте все ссылки с протоколом http/https без атрибута rel, а затем добавляем его.
// PHP
$html = 'site.com,
<а href="site.com">my-site.comа>,
site.com';
$re = '/(]*\brel=)([^>]*\bhref=\"https?:\/\/[^"]+\"))/';
$result = preg_replace($re, '$1 rel="nofollow"', $html);
Подсветка слов
/\b(ipsum)\b/ig
// JS
let text = 'Lorem ipsum dolor, lorem ipsum dolor.';
text.replace(re, '$&')
Другие полезные варианты
Удалить повторы слов в строке
/(\w+)\s+\1/gi
// JS
"hello world world hello".replace(re, "$1") // hello world hello
Количество слов
Проверяем количество слов в строке.
^[^\s]*$ // ровно одно слово
^[^\s]*\s[^\s]*$ // ровно два слова
^[^\s]*\s[^\s]* // два слова и больше
^([^\s]*\s){2}[^\s]*$ // ровно три слова
^([^\s]*\s){4, }[^\s]*$ // пять слов и больше