Вопросы
Где можно проверить шаблон?
Тестер regex подсвечивает совпадения в реальном времени, перечисляет группы, показывает предпросмотр замены и объясняет шаблон по токенам.
Синтаксис, общий для всех основных движков, с различиями в одной таблице в конце.
| ^ $ | начало / конец текста (строки с флагом m) |
| \A \z \Z | начало / конец текста независимо от флагов (нет в JS) |
| \b \B | граница слова / не граница |
| . | любой символ, кроме перевода строки (любой с флагом s) |
| \d \w \s | цифра, символ слова, пробельный; \D \W \S — отрицание |
| [abc] [a-z] [^abc] | набор, диапазон, инвертированный набор |
| [\]\\^-] | внутри набора экранировать нужно только ] \ ^ - |
| \t \n \r \xHH \uHHHH | табуляция, перевод строки, CR, hex, Unicode |
| \p{L} \p{Lu} \p{N} \p{Script=Cyrillic} | свойства Unicode (флаг u в JS) |
| [[:alpha:]] [[:digit:]] | POSIX-классы (grep, PCRE; не JS) |
| \. \* \( \\ | экранированный метасимвол = литерал |
| * + ? | 0+, 1+, 0 или 1 |
| {n} {n,} {n,m} | ровно, не менее, от и до |
| *? +? ?? {n,m}? | ленивые: как можно меньше |
| *+ ++ ?+ | притяжательные: без отката (PCRE, Java) |
| (abc) | захват, нумерация с 1 |
| (?:abc) | без захвата |
| (?<name>abc) | именованная (Python: (?P<name>…)) |
| \1 \k<name> | обратная ссылка (Python: (?P=name)) |
| a|b | альтернатива (самый низкий приоритет) |
| (?>abc) | атомарная группа (PCRE, Java) |
| (?i)abc (?i:abc) | встроенный флаг, встроенный флаг с областью действия |
| (?=x) | за которым следует x |
| (?!x) | за которым не следует x |
| (?<=x) | которому предшествует x |
| (?<!x) | которому не предшествует x |
| g | все совпадения (JS, PHP через функцию) |
| i | игнорировать регистр |
| m | ^ $ совпадают на границах строк |
| s | . совпадает с переводом строки (DOTALL) |
| x | игнорировать пробелы и комментарии # в шаблоне (PCRE, Python; не JS) |
| u | Unicode (JS); нужен для \p{} |
| y | sticky (JS) |
| $1 $<name> $& | JS, .NET: группа, именованная, всё совпадение |
| \1 \g<name> | Python re.sub |
| $1 \1 ${name} | PCRE / PHP preg_replace; Go использует $1 и ${name} |
| sed 's/(a)(b)/\2\1/' | sed -E (базовому sed нужны \( \)) |
| ^\s*$ | пустая строка |
| \s+$ | пробелы в конце строки |
| \b(?:\d{1,3}\.){3}\d{1,3}\b | IPv4 (нестрого) |
| [\w.+-]+@[\w-]+(?:\.[\w-]+)+ | email (практичный) |
| https?://[^\s"'<>]+ | URL |
| \d{4}-\d{2}-\d{2} | дата ISO |
| #(?:[0-9a-fA-F]{3}){1,2}\b | hex-цвет |
| "(?:[^"\\]|\\.)*" | строка в двойных кавычках с экранированием |
| ^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}$ | пароль с цифрой, строчной, заглавной, 8+ |
| (\w+)\s+\1 | повторяющееся слово |
| JavaScript | нет \A \z, нет флага x, нет притяжательных/атомарных; lookbehind есть; именованные группы (?<n>) |
| PCRE (PHP, nginx, HAProxy) | всё; разделители /…/ в PHP |
| Python re | (?P<n>), нет притяжательных до 3.11, \Z = конец |
| Go RE2, Rust regex | линейное время; нет lookaround, нет обратных ссылок |
| grep -E / sed -E | ERE: нет \d (используйте [0-9]), POSIX-классы, нет ленивых квантификаторов |
| grep (базовый) | \( \) \{ \} \+ \? экранируются, чтобы стать специальными |
| Java | притяжательные, атомарные; в строках нужны двойные обратные слеши |
Результаты и сообщения этого инструмента выводятся на английском языке.
Тестер regex подсвечивает совпадения в реальном времени, перечисляет группы, показывает предпросмотр замены и объясняет шаблон по токенам.