Регулярные выражения: примеры на JS

Регулярные выражения (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
				
			

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
				
			

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

				
					/^\+?(\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

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

rel=«nofollow»

Интересный пример: выбираем в тексте все ссылки с протоколом http/https без атрибута rel, а затем добавляем его.
				
					// PHP
$html = '<a href="https://site.com" data-wpel-link="external" rel="nofollow external noopener noreferrer">site.com</a>,
      <а href="site.com">my-site.com</а>,
      <a href="https://site.com" rel="nofollow external noopener noreferrer" data-wpel-link="external">site.com</a>';
$re = '/(<a\s*(?![^>]*\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, '<span style="background: yellow">$&</span>')
				
			

Другие полезные варианты

Удалить повторы слов в строке

				
					/(\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]*$ // пять слов и больше