У меня есть признание, которое заставит пуристов-регексов вздрогнуть: первые несколько лет моей карьеры я писал регулярные выражения, копируя-вставляя из Stack Overflow, меняя один символ, запуская код, видя, что он не работает, и повторяя, пока он не сработал. Я не понял ' не понял шаблоны - я запугал их, заставив подчиниться. Это было медленно, и что еще хуже, шаблоны, которые я отправлял, были хрупкими, как я мог и #39; не вижу.
Что это исправило, так это 't чтение теории (хотя в конце концов я это сделал). Это был визуальный тестер - коробка, в которой я печатаю шаблон, коробка, куда я вставляю тестовые строки и сопоставляю их, которые зажигаются в тот момент, когда я что-то меняю. Внезапно я смог полагаться почему \d+ Схватил больше, чем хотел, или почему моя шаблон электронной почты отклонил совершенно допустимый адрес. Регулярное выражение перестало быть игрой в угадайку и стала жесткой петлей обратной связи.
это именно то, что регулярный конструктор на Toolz.dev is. вы пишете шаблон, падаете в тестовых данных, переключаете флаги, и смотрите совпадения и захваченные группы выделять в реальном времени. он полностью работает в вашем браузере, поэтому линии журнала или пользовательские данные вы 're тестирование против никогда не быть загружены где-либо. Это руководство является regex ссылки я бы хотел I 'd имел тогда - шаблоны, которые я на самом деле повторно использую, полный шпаргалка, и единственная ошибка, которая может взять вниз производственный сервер.
TL;DR: Вставьте свой шаблон и протестируйте строки в регулярный конструктор и переключите
g/i/mФлаги, чтобы увидеть матчи, выделенные вживую. Начните просто, добавьте ограничения, чтобы убить ложные срабатывания, и проверьте враждебные данные, чтобы избежать катастрофического возврата. Для извлеченных данных соедините их с Форматтер JSON а Конвертер Base64, йо- Все клиенты, все бесплатно.
Что такое регулярное выражение?
Регулярное выражение - regex или regexp - это компактная строка, описывающая шаблон поиска Вместо & quot;найти слово cat, & quot; можно сказать & quot;найти любое пятизначное число, & quot; & quot;найти всё, что выглядит как электронное письмо, & quot; или & quot;найти каждую строку, которая начинается с ERROR. & quot; почти каждый язык и редактор поддерживают их, что делает навык таким портативным: выучите его один раз и вы используете в JavaScript, Python, своем grep, и ваша идея найти и заменить.
Концепция появилась в рамках формальной теории языка 1950-х годов, и Кен Томпсон подключил ее к вычислениям в 1960-х годах для редактирования текста. Эта история имеет значение по одной практической причине, я вернусь к: «Обычные» языки имеют ограничения, поэтому regex действительно не может анализировать вложенные структуры, такие как HTML, независимо от того, насколько умно вы становитесь.
Где я добираюсь до регулярного выражения в обычную неделю: проверка ввода пользователя до того, как она попадет в базу данных, вытаскивает поля из неструктурированных строк журнала, выполняет поиск и замену всей кодовой базы, которую простой поиск не может выражать, и фильтровать данные во время миграции. выше регулярный конструктор где я прототипирую каждый из них, прежде чем он приближается к реальному коду.
Вот фундаментальные строительные блоки - алфавит, из которого вы собираете узоры:
| синтаксис | смысл | пример | спичка |
|---|---|---|---|
. |
Любой символ, кроме новой строки | h.t |
Шляпа, горячая, хитка |
\d |
Любая цифра (0-9) | \d{3} |
123, 456 |
\w |
Слово char (A-Z, A-Z, 0-9, _) | \w+ |
Здравствуйте, test_123 |
\s |
Любое пробел | hello\sworld |
Привет мир |
^ |
Начало строки | ^Hello |
Привет на старте |
$ |
конец струны | end$ |
конец в конце |
* |
ноль или более | ab*c |
AC, ABC, ABBC |
+ |
один или несколько | ab+c |
ABC, ABBC |
? |
ноль или один | colou?r |
цвет, цвет |
{n} |
ровно n раз | \d{4} |
2026 |
{n,m} |
между н и м | \d{2,4} |
12, 123, 1234 |
[abc] |
класс персонажа | [aeiou] |
любая гласная |
[^abc] |
отрицательный класс | [^0-9] |
Любой нецифровой |
(...) |
Захват группы | (hello) |
Захватывает "Привет" |
a|b |
чередование (или) | cat|dog |
кошка или собака |
Какие шаблоны регулярных выражений должны держать каждый разработчик под рукой?
Это те, которые я тестировал, сломал, исправлен и теперь храню в личном файле фрагмента. скопируйте их прямо в регулярный конструктор И бросайте в них свои краевые чехлы.
Электронная почта (практический вид)
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
это соответствует [email protected] а [email protected], и отклоняет @example.com или user@com, йо- Однако вот важная честность: полная грамматика электронной почты в RFC 5322 чудовищно сложно - технически это позволяет цитировать строки и комментарии почти никто не использует. Don't гонитесь за 100% RFC соответствие с regex. Соответствовать практичные 99% с шаблоном выше, затем подтвердить адрес реален, отправив верификационное электронное письмо. That's ошибка, которую я вижу больше всего: команды сжигают дни на "airtight" email regex, который все еще может't сказать реальный почтовый ящик из опечатки.
сводка
^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&\/=]*)$
спичка https://toolz.dev а http://www.example.com/path?query=value; отвергает ftp://... и обычный текст.
номер телефона США
^(\+1)?[-.\s]?\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}$
достаточно гибкий для 555-123-4567, (555) 123-4567, +1 555.123.4567, и 5551234567, йо-
IPv4 адрес
^((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]?)$
Вложенная чередование — это то, что обеспечивает то, что каждый октет остается в 0–255, поэтому он правильно отклоняет 999.999.999.999, йо-
Надежная проверка паро
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$
Требуется не менее 8 символов со строчными буквами, прописными буквами, цифрами и символом. выше (?=...) каждый из заглядывающих утверждает одно условие, не потребляя персонажей - аккуратный трюк, который стоит понять.
Дата ISO (ГГГГ-ММ-ДД)
^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$
спичка 2026-07-11, отклоняет 2026-13-01 а 2026-02-32, йо-
шестигранный цвет
^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$
спичка #4466EE, #abc, #000000, йо-
Шпаргалка по регулярному выражению
Держите это в закрепленном. Это ссылка, которую я проверяю больше всего.
якорные
| образец | описание |
|---|---|
^ |
Начало строки (или строки в многострочном режиме) |
$ |
Конец строки (или строка в многострочном режиме) |
\b |
граница слова |
\B |
несловная граница |
квантильники
| образец | описание |
|---|---|
* |
0 или более (жадных) |
+ |
1 или более (жадный) |
? |
0 или 1 (жадный) |
*? +? ?? |
Ленивые версии - совпадают как можно меньше |
{n} {n,} {n,m} |
точно n/n или более / между n и m |
Классы персонажей
| образец | описание |
|---|---|
[abc] |
а, б или с |
[^abc] |
Не А, В или С |
[a-z] [A-Z] [0-9] |
хребет |
\d \D |
Цифра / нецифра |
\w \W |
Word char / не-слово |
\s \S |
Пробел / небелое пространство |
Группы и осмотр
| образец | описание |
|---|---|
(abc) |
группа захвата |
(?:abc) |
не захватывающая группа |
(?<name>abc) |
названная группа захвата |
(?=abc) / (?!abc) |
Положительный / отрицательный взгляд |
(?<=abc) / (?<!abc) |
Положительный / отрицательный взгляд |
флаги
| знамя | описание |
|---|---|
g |
Глобальный - найдите все совпадения |
i |
нечувствительный к регистру |
m |
Многолинейный - ^ а $ Сопоставьте границы линий |
s |
Доталл - . Соответствует новым строкам |
u |
Поддержка Юникода |
Как вы строите и отлаживаете шаблон, не теряя ни часа?
Мой процесс скучный специально, потому что скучно повторяемо:
- Начните с простейшей вещи, которая соответствует одному реальному примеру. Не пытайтесь сразу же обрабатывать каждый случай.
- Вставьте как положительные, так и отрицательные строки теста в регулярный конструктор- вещи, которые должны совпадать, и вещи, которые не должны совпадать.
- Затягивайте, чтобы убить ложные срабатывания. Добавить якоря (
^,$) так что шаблон соответствует всей строке и подкаляет.Для конкретных классов, таких как[a-z]или[^,], йо- - кинуть в него состязательный вклад- пустые строки, огромные входные данные, Unicode и буквальные символы регекса в качестве данных.
- Только тогда оптимизируйте.
Когда что-то не так себя ведет, это почти всегда одна из трех вещей. если это Слишком много соответствует, ваши кванторы жадны - сделайте их ленивыми (*?) или ваши занятия более конкретные. если это Слишком мало соответствует, вам, вероятно, понадобится i флаг или забыл избежать специального символа. если это Ничего не соответствует, проверьте наличие неэсидируемых метасимволов (., *, +, (, [, {, и т. д.) предназначены для буквальных или невидимых символов, таких как вкладки, прячущиеся в вашей тестовой строке.
Что такое катастрофическое отступление и почему его нужно бояться?
Это раздел, который я татуирую на новых разработчиках, если бы мог. В начале я отправил регулярное выражение ввода-вывода, которое выглядело совершенно невинным, и однажды один запрос увеличил ядро процессора до 100% и оставалось там. Шаблон был проблемой.
Когда двигатель регулярного выдерживания не может найти совпадение, он отступление- он отступает и пытается другими способами удовлетворить шаблон Определенные формы заставляют количество путей взрываться экспоненциально. Хрестоматийный пример:
^(a+)+$
кормить, что вход как aaaaaaaaaaaaaaaaaaaab (бег a заканчивающийся в b), а вложенные кванторы дают движку астрономическое количество способов разделить aS, все из которых он пытается, прежде чем заключить "No Match." Ваше приложение зависает. Это настоящий класс отказа в обслуживании, называемый повторный (Отказ в обслуживании в обычном выражении), и злоумышленники используют его.
Как оставаться в безопасности:
- Никогда не вводите квантификаторы.
(a+)+,(a*)*, и(a+)*являются красными флажками. - Используйте атомные группы или притяжательные кванторы Где их поддерживает двигатель:
(?>a+)илиa++, йо- - Будьте конкретны.
[a-z]+отступает меньше, чем.+Потому что у него меньше путей для изучения. - Закрепите свои узоры Таким образом, двигатель выходит из строя при несоответствующем входе.
- Тестируйте со строками, которые почти совпадают, но не совпадают в самом конце- это и #39; худший случай для обратного отслеживания.
Если вы находитесь в GO, эта проблема просто не существует, что подводит меня к следующему разделу.
Как регулярные выражения отличаются между языками?
Базовый синтаксис движется хорошо, но детали кусаются. Это различия, которые я действительно споткнулся.
JavaScript:
const regex = /\d{3}-\d{4}/g;
const pattern = new RegExp('\\d{3}-\\d{4}', 'g'); // note the doubled backslashes
'555-1234'.match(regex); // ["555-1234"]
const m = '2026-07-11'.match(/(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/);
m.groups.year; // "2026"
Осторожно: Lookbehind прибыл только в ES2018, \d Соответствует только цифрам ASCII, а g флаг делает .test() с госпокой lastIndex- тонкий источник ошибок в циклах.
питон:
import re
pattern = re.compile(r'\d{3}-\d{4}') # raw strings avoid double-escaping
pattern.findall('Call 555-1234 or 555-5678') # ['555-1234', '555-5678']
Всегда используйте необработанные строки (r'...'). помнят re.match только якоря в начале - использовать re.search найти где угодно. а re.VERBOSE Позволяет писать многострочные комментируемые шаблоны, которые являются спасательным средством для сложных.
PHP: Шаблоны нужны разделители ('/\d{3}-\d{4}/'), он использует мощный движок PCRE, и preg_match обратный 1, 0, или false об ошибке - так что уточняйте ===, йо-
ИДИТЕ: Использует двигатель RE2, который намеренно Сбросы lookheads, lookbehinds и backreferences в обмен на гарантию сопоставления с линейным временем. Это означает, что катастрофическое возврат даже невозможен - действительно другой компромисс, который стоит знать, когда вы выбираете язык для сопоставления ненадежных входных данных.
Реальный пример: анализ строки журнала Apache
Вот в чем действительно хороша регулярная выражение. Стандартная строка журнала доступа Apache выглядит так:
192.168.1.1 - frank [11/Jul/2026:10:27:10 -0500] "GET /api/users HTTP/1.1" 200 1234
Этот узор разъединяет его:
^(\S+) \S+ (\S+) \[([^\]]+)\] "(\S+) (\S+) (\S+)" (\d{3}) (\d+)$
Вставьте оба в регулярный конструктор И каждая захваченная группа загорается отдельно:
| группа | содержащийся | пример |
|---|---|---|
| 1 | IP-адрес | 192.168.1.1 |
| 2 | Имя пользователя | откровенный |
| 3 | отметка времени | 11.07.2026:10:27:10 -0500 |
| 4 | HTTP-мет | становиться |
| 5 | Путь к запросу | /API/пользователи |
| 6 | HTTP-верс | HTTP/1.1 |
| 7 | Код статуса | 200 |
| 8 | Размер ответа | 1234 |
Как только группы выстроятся в тестер, переводя его в re.findall В Python или match() в JavaScript это тривиально - и вы уже знаете, что это работает.
Часто задаваемые вопросы
Что такое конструктор регулярных выражений?
Конструктор регулярных выражений — это интерактивный инструмент, в котором вы набираете регулярное выражение и сразу видите, что оно соответствует тестовым строкам, с выделенными соответствиями и захваченными группами. Он заменяет медленный цикл записи-run-run-fail-rewrite в вашем коде на живой. выше регулярный конструктор На Toolz.dev это делается полностью в вашем браузере, поэтому тестовые данные остаются на вашем компьютере.
Совпадают ли шаблоны регулярных выражений в каждом языке программирования?
Базовый синтаксис почти идентичен, но детали достаточно различаются, чтобы вызвать ошибки. В более старом JavaScript не было LookBehind, в Go движок RE2 Go вообще не имеет проверок или обратных ссылок, а группы имен Python с (?P<name>...) в некоторых контекстах. Всегда подтверждайте шаблон на языке, на который вы на самом деле ориентируетесь, а не на мобильность.
Как проверить адрес электронной почты с помощью regex?
Используйте практический узор, такой как ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$, который обрабатывает подавляющее большинство реальных адресов. не пытайтесь полностью RFC 5322 соответствие в regex - грамматика слишком сложная и вы 'll все еще отклонить действительные адреса или принять typos.Pair the regex с верификацией электронной почты, чтобы подтвердить, что входящий в папку действительно существует.
Почему мое регулярное выражение зависает приложение?
Почти всегда катастрофические отступы. Шаблоны с вложенными квантификаторами, такими как (a+)+ Создайте экспоненциальное количество путей совпадения, когда они соответствуют входу, который почти совпадает, но в конечном итоге терпит неудачу, и движок пробует их все. Удалите вложенные квантификаторы, предпочитайте определенные классы символов, а не .+, и добавьте анкеры, чтобы двигатель мог быстро выйти из строя.
Могу ли я использовать regex для анализа HTML или JSON?
Нет, ни для чего, кроме тривиального извлечения. HTML и JSON не являются обычными языками - они допускают произвольное вложение, которое regex принципиально не может отслеживать.Используйте реальный синтаксический анализатор: DOMParser или Cheerio для HTML, и JSON.parse или инструмент JSON для JSON. regex — неправильный инструмент, в который гнездится структура.
Какая разница между жадным и ленивым?
жадные квантификаторы (*, +, ?) берите как можно больше и отступайте, если нужно, ленивые (*?, +?, ??) хватать как можно меньше и расширяться только при принуждении. против <b>bold</b>, жадный <.*> глотает всю струну, пока ленится <.*?> останавливается на первом <b>, йо- Выбор правильного часто является исправлением, когда шаблон слишком много подходит.
Как избежать специальных символов в регулярном выражении?
Поставьте обратную косую косую черту перед любым метасимволом, который вы имеете в виду буквально: \., \*, \+, \?, \(, \), \[, \], \{, \}, \^, \$, \|, и \\. Большинство языков также предлагают вам помощь, позволяющую избежать целой строки - re.escape() например, в Python - что безопаснее, чем побег вручную, когда строка поступает из пользовательского ввода.
Что означают флаги регулярных выражений g, i и m?
g (глобальный) находит каждое совпадение вместо того, чтобы останавливаться на первом, i (игнорировать случай) делает шаблон нечувствительным к регистру, и m (многолинейный) делает ^ а $ совпадать на каждом разрыве строки, а не только на начало и конец струны. Они свободно сочетаются, поэтому gim Делает все три. частая уловка в JavaScript: повторное использование g Регулярное выражение через вызовы lastIndex между ними, что делает test() чередуйте true и false - воссоздайте шаблон или сбросьте lastIndex, йо-
Что такое lookhead в регулярных выражениях?
Смотрится, что что-то не следует или не следует, не потребляя его. foo(?=bar) спичка foo только когда bar идет дальше; foo(?!bar) Соответствует только тогда, когда он не работает. глядя за ((?<=...), (?<!...)) делает то же самое наоборот, и приземлился в современных JavaScript, Python и PCRE - но не в Go's RE2, который полностью отвергает оба правила пароля являются классическим использованием: ^(?=.*\d)(?=.*[a-z]).{8,}$ Утверждается, так что каждое требование проверяется независимо в одной и той же позиции.
Как сопоставить номер телефона с регулярным выражением?
Для определенного формата будьте явными, а не умными: ^\(\d{3}\) \d{3}-\d{4}$ спичка (555) 123-4567, йо- Для переноса различных разделителей разрешать дополнительные, такие как ^\+?1?[-.\s]?\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}$. Нумерация телефонов в разных странах беспорядочна, поэтому перед сохранением проверьте только тот формат, который вы фактически принимаете, и нормализуйте его по цифрам - создайте и протестируйте шаблон в реальном времени, прежде чем доверять ему.
завершение
Регулярное выражение перешло от моего самого страшного навыка к одному из самых популярных, когда я начал создавать шаблоны в живом тестере, а не гадать в моем редакторе. Начните с простого, тестируйте на реальный и враждебный вклад, уважайте катастрофические отклики и храните личную библиотеку шаблонов, которым вы доверяете.
выше регулярный конструктор на Toolz.dev этот цикл выполняется быстро, с сопоставлением в реальном времени, групповым выделением и переключателями флагов - все это работает в вашем браузере, поэтому данные вашего теста остаются конфиденциальными. Когда ваш шаблон извлекает JSON, передайте его в Форматтер JSON; Когда он захватывает BOBAS64 BLOB, декодируйте его с помощью Конвертер Base64, йо- или просмотрите все 600+ бесплатных инструментов по адресу Toolz.dev, йо-



