Регекс Cheat Sheet: шаблоны, флаги и реальные примеры
Практический чип-лист регулярных выражений с классами символов, количественными показателями, якорями, группами, обозрениями, флагами и проверенными шаблонами для повседневных задач.
· 5 мин чтения
Регулярные выражения - это компактный язык для описания текста. Одна строка может подтверждать ввод, извлекать данные из журналов или переименовывать сотни файлов. Однако синтаксис плотный, и небольшие ошибки порождают закономерности, которые практически работают. Эта таблица собирает синтаксис, который вы будете использовать каждый день, объясняет части, которые мешают людям, и заканчивается проверенными шаблонами, которые вы можете адаптировать. Все примеры используют синтаксис JavaScript, который также очень близок к Python, Java, Go и .NET.
Попробуйте каждый шаблон в regex tester по мере чтения; видеть подчеркнутые совпадения - самый быстрый способ создать интуицию.
Буквальные символы и побег
Большинство персонажей совпадают между собой: cat совпадает с "котом". Двенадцать символов имеют особое значение и должны быть вычеркнуты с обратной строкой, чтобы соответствовать буквально:
. * + ? ^ $ { } ( ) | [ ] \ /
Так что 3.14 совпадает с "3,14", но также "3x14", в то время как 3\.14 совпадает только с "3,14".
Классы символов
| Образец | Костровки |
|---|---|
. |
Любой символ, кроме новой строки (если не установлен флаг s) |
\d |
Цифра 09 |
\w |
Знак слова: буква, цифра или подчерк |
\s |
Белое пространство: пространство, вкладка, новая строка |
\D, \W, \S |
Противоположное вышеизложенному |
[abc] |
Один из a, b или c |
[a-z] |
Любая буква ASCII с маленькими буквами |
[^0-9] |
Любой символ , который не является цифрой |
\p{L} |
Любая буква в любом шрифте (требует флага u) |
В квадратных скобках большинство специальных символов теряют свое значение. [.] соответствует буквальной точке. Дефис буквален, когда он помещен в первую или последнюю строку: [-a-z].
Количественные показатели
| Образец | Значение |
|---|---|
a* |
0 или более |
a+ |
Один или несколько |
a? |
Ноль или один (необязательно) |
a{3} |
Ровно три . |
a{2,5} |
Между 2 и 5 |
a{2,} |
Два и более |
Количественные показатели жадны: они совпадают как можно больше, а затем возвращаются назад. Добавление ? делает их ленивыми. Учитывая <b>bold</b>, шаблон <.+> соответствует всей строке, в то время как <.+?> соответствует только <b>.
Анкеры и границы
^совпадает с началом строки или каждой строки с флагомm.$совпадает с концом строки, или каждой строки сm.\bсовпадает с границей слова: положение между словесным и несловесным символом.
\bcat\b совпадает с "кошка" в "кошка сидела", но не в "конкатенат". Анкеры необходимы для проверки: \d{5} находит пять цифр в любом месте в "abc123456", в то время как ^\d{5}$ требует, чтобы весь вход был ровно пятью цифрами.
Группы и чередование
(abc)группы и добычи. Захваченный текст доступен как$1,$2в замены.(?:abc)группируется без захвата, что быстрее и удерживает чистый номер.(?<year>\d{4})- это группа с именем, доступная какmatch.groups.year.a|bсовпадает с A или B. Альтернативность имеет наименьшее значение, поэтому^cat|dog$означает "начинается с кошки" или "заканчивается с собакой". Используйте^(?:cat|dog)$, чтобы сопоставить одно слово.\1является обратной ссылкой на группу 1:(\w)\1находит двойные буквы, такие как "ll" в "привет".
Оглянись .
Окружающие точки утверждают, что что-то находится или не находится рядом с текущей позицией, не потребляя символов.
| Образец | Значение |
|---|---|
(?=...) |
Положительный прогноз: |
(?!...) |
Отрицательное предзнаменование: не сопровождается |
(?<=...) |
Позитивный взгляд назад: |
(?<!...) |
Negative lookbehind: не предшествует |
Примеры: \d+(?=px) совпадает с числом в "16px" без "px"; (?<=\$)\d+ совпадает с суммой после знака доллара; ^(?!.*password).*$ совпадает с строками, которые не содержат "пароль".
Флаги
g(глобальный): найдите все совпадения вместо того, чтобы останавливаться на первом.i(игнорируйте):aсовпадает с "A".m(многолинейный):^и$совпадают при перерывах линии.s(dotAll):.также совпадает с новыми линиями.u(уникод): рассматривает суррогатные пары, такие как смайлики, как одиночные символы и позволяет использовать\p{...}.y(приклеенный): матчи только на позиции, где закончился последний матч.
Узоры для повседневных задач
Они практичны, а не исчерпывающие. Реальная проверка должна сочетаться с проверкой на стороне сервера.
Электронная почта (прагматичная):
^[^\s@]+@[^\s@]+\.[^\s@]{2,}$
Захватывает опечатки, такие как отсутствующий @ или домен; единственное реальное подтверждение - отправка подтверждения по электронной почте.
** URL-слайг:**
^[a-z0-9]+(?:-[a-z0-9]+)*$
Дата ISO (ГГГ-ММ-ДД):
^(?<year>\d{4})-(?<month>0[1-9]|1[0-2])-(?<day>0[1-9]|[12]\d|3[01])$
Это проверяет форму и диапазон, но не то, существует ли 31 февраля; проанализируйте дату, чтобы подтвердить.
** Цвет экса:**
^#(?:[0-9a-fA-F]{3}){1,2}$
** IPv4 адрес:**
^(?:(?:25[0-5]|2[0-4]\d|1?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|1?\d?\d)$
** Семантическая версия:**
^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[\w.-]+)?(?:\+[\w.-]+)?$
Сильная проверка пароля (не менее 12 символов, один малый, один большой, одна цифра):
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{12,}$
** Отрезать пробелы:** заменить ^\s+|\s+$ (с g) пустой строкой.
** Свернуть повторяющиеся пробелы:** заменить {2,} на одно пробелое.
Вывод пары ключей=значений из логистической строки:
(\w+)=("[^"]*"|\S+)
camelCase to snake_case: заменить ([a-z0-9])([A-Z]) на $1_$2, а затем зафиксировать результат меньшими буквами. Более подробную информацию о стилях названия см. в [camelCase vs snake_case] ((/blog/naming-conventions-camelcase-snake-case).
Производительность и катастрофическое отслеживание
Двигатели Regex в JavaScript, Python и Java используют обратный отслеживание. Некоторые модели заставляют двигатель пробовать экспоненциальное количество комбинаций на входах, которые почти совпадают. Классический пример - ^(a+)+$ против "aaaaaaaaaaaaaaaaaaaa!". Каждая дополнительная "а" удваивает работу, и несколько десятков символов могут заморозить сервер вектор отказа в обслуживании, известный как ReDoS.
Чтобы избежать этого:
- Не вкладывайте количественные показатели в одни и те же символы, как в
(a+)+или(\w*)*. - Сделайте альтернативы взаимоисключающими:
(a|ab)*рискован; реструктуризируйте его. - Предпочтительнее конкретные классы, чем
.*:"[^"]*"безопаснее и быстрее, чем".*?". - Ограничьте длину ввода, прежде чем сравнивать ненадежные данные.
Советы по удобству чтения
- Постройте сложные узоры постепенно и испытайте каждый кусок.
- Используйте названные группы, чтобы код читал
m.groups.monthвместоm[2]. - Комментируйте сложные закономерности в коде или стройте их из небольших строк.
- Если шаблону нужно больше одной-двух строк, подумайте, будет ли более понятен небольшой анализатор.
Итоги
Научитесь основным классам, количественным показателям, якорям, группам и флагам и вы сможете прочитать большинство реджексов, с которыми сталкиваетесь. Используйте ленивые количественные показатели и якорь намеренно, стремитесь к поиску, когда вам нужен контекст, не потребляя его, следите за вложенными количественными показателями и всегда тестируйте как совпадающие, так и не совпадающие примеры, прежде чем отправлять шаблон.
Эта страница переведена с английского автоматически. Если вы заметили ошибку, сообщите нам.