Utilo

Регекс 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].
  • Комментируйте сложные закономерности в коде или стройте их из небольших строк.
  • Если шаблону нужно больше одной-двух строк, подумайте, будет ли более понятен небольшой анализатор.

Итоги

Научитесь основным классам, количественным показателям, якорям, группам и флагам и вы сможете прочитать большинство реджексов, с которыми сталкиваетесь. Используйте ленивые количественные показатели и якорь намеренно, стремитесь к поиску, когда вам нужен контекст, не потребляя его, следите за вложенными количественными показателями и всегда тестируйте как совпадающие, так и не совпадающие примеры, прежде чем отправлять шаблон.

Эта страница переведена с английского автоматически. Если вы заметили ошибку, сообщите нам.

Похожие руководства