Какие специальные символы должны быть экранированы в регулярных выражениях?
Я устал всегда пытаться угадать, если я должен избежать специальных символов, таких как'()[]{}|' и т. д. при использовании многих реализаций регулярных выражений.
он отличается, например, Python, sed, grep, awk, Perl, rename, Apache, find и так далее.
Есть ли набор правил, который говорит, Когда я должен, а когда нет, избегать специальных символов? Зависит ли это от типа регулярных выражений, таких как PCRE, POSIX или расширенные регулярные выражения?
8 ответов:
какие символы вы должны и которые вы не должны избегать, действительно зависит от вкуса регулярного выражения, с которым вы работаете.
для PCRE и большинства других так называемых Perl-совместимых ароматов, избегите этих внешних классов символов:
.^$*+?()[{\|и эти внутренние классы символов:
^-]\для расширенных регулярных выражений POSIX (ERE) экранируйте эти внешние классы символов (такие же, как PCRE):
.^$*+?()[{\|экранирование любых других символов является ошибкой с POSIX ПРЕЖДЕ ЧЕМ.
внутри символьных классов обратная косая черта является литеральным символом в регулярных выражениях POSIX. Вы не можете использовать его, чтобы избежать чего-либо. Вы должны использовать "умное размещение", если вы хотите включить метасимволы класса символов в качестве литералов. Поместите ^ в любом месте, кроме как в начале,] в начале и - в начале или в конце класса символов, чтобы соответствовать им буквально, например:
[]^-]в POSIX основные регулярные выражения (BRE), это метасимволы, которые вам нужно бежать, чтобы подавить их значение:
.^$*экранирование скобок и фигурных скобок в BREs придает им особое значение, которое их неоткрытые версии имеют в EREs. Некоторые реализации (например, GNU) также придают особое значение другим символам при экранировании, например \? и.+ Бегство от другого персонажа .^ $ * () {} обычно является ошибкой с BREs.
внутри классов символов BREs следует тому же правилу, что и EREs.
если все это заставляет вашу голову кружиться, возьмите копию RegexBuddy. На вкладке Создать щелкните вставить маркер, а затем литерал. RegexBuddy будет добавлять побеги по мере необходимости.
современные вкусы регулярных выражений (PCRE)
включает в себя с, с++, Delphi, editpad выступает, Ява, яваскрипт, Перл, РНР (бере), в PostgreSQL, PowerGREP, в PowerShell, питон, цвета, реальный-студия, Рубин, ночной клуб, VB.Net и VBScript, wxWidgets, в, XML-схемы, Xojo, XRegExp.
совместимость PCRE может варьироватьсягде:
. ^ $ * + - ? ( ) [ ] { } \ |
Legacy RegEx Flavors (BRE/ERE)
включает awk, ed, egrep, emacs, GNUlib, grep, PHP (ereg), MySQL, Oracle, R, sed.
поддержка PCRE может быть включена в более поздних версиях или с помощью расширенийERE/awk/egrep / emacs
вне класса символов:
. ^ $ * + ? ( ) [ { } \ |
Внутри класса символов:^ - [ ]BRE/ed/grep / sed
вне класса символов:
. ^ $ * [ \
Внутри класса символов:^ - [ ]
Для литералов, не надо побег:+ ? ( ) { } |
Для стандартного поведения регулярных выражений escape:\+ \? \( \) \{ \} \|
Примечания
- если вы не уверены в конкретном персонаже, его можно экранировать как
\xFF- буквенно-цифровые символы могут быть экранированы
- произвольные символы могут быть экранированы с обратной косой чертой в PCRE, но не BRE/ERE (они должны быть экранированы только при необходимости). Для PCRE
] -только нужно бежать в классе символов, но я сохранил их в одном списке для простоты- строки выражений в кавычках также должны иметь экранированные окружающие символы кавычек и часто с удвоенными обратными косыми чертами (например,
"(\")(/)(\.)"и/(")(\/)(\.)/в JavaScript)- помимо экранирования, различные реализации регулярных выражений могут поддерживать различные модификаторы, классы символов, якоря, кванторы и другие функции. Для получения более подробной информации, проверьте regular-expressions.info, или использовать regex101.com чтобы проверить свои выражения в прямом эфире
к сожалению, на самом деле нет набора escape-кодов, поскольку он зависит от используемого языка.
однако, сохраняя страницу, как Страница Инструментов Регулярных Выражений или это Регулярное Выражение Cheatsheet может пойти длинный путь, чтобы помочь вам быстро отфильтровать вещи.
POSIX распознает несколько вариантов регулярных выражений-базовые регулярные выражения (BRE) и расширенные регулярные выражения (ERE). И даже тогда есть причуды из-за исторических реализаций утилит, стандартизированных POSIX.
не существует простого правила, когда использовать какую нотацию или даже какую нотацию использует данная команда.
Проверьте Джеффа Фридла Использование Регулярных Выражений книги.
к сожалению, значение таких вещей, как( и \ (меняются местами между регулярными выражениями стиля Emacs и большинством других стилей. Поэтому, если вы попытаетесь избежать этого, вы можете делать противоположное тому, что вы хотите.
Так что вы действительно должны знать, какой стиль вы пытаетесь цитировать.
Иногда простой экранирование невозможно с символами, которые вы перечислили. Например, использование обратной косой черты для выхода из скобки не будет работать в левой части строки подстановки в sed, а именно
sed -e 's/foo\(bar/something_else/'Я, как правило, просто использовать простое определение класса символов вместо этого, так что выше выражение становится
sed -e 's/foo[(]bar/something_else/'который я нахожу работает для большинства реализаций регулярных выражений.
кстати классы символов довольно ванильные компоненты регулярных выражений поэтому они, как правило, работают в большинстве ситуаций, когда вам нужны экранированные символы в регулярных выражениях.
Edit: после комментария ниже, просто подумал, что я упомяну тот факт, что вы также должны учитывать разницу между конечными автоматами и автоматами с не конечными состояниями при рассмотрении поведения оценки регулярных выражений.
вы можете посмотреть на "The shiny ball book" aka Effective Perl (sanitised Amazon link), в частности глава о регулярные выражения, чтобы почувствовать разницу в типах оценки механизма регулярных выражений.
Не все в мире ПКЕРЕ!
в любом случае, регулярные выражения настолько неуклюжи по сравнению с СНОБОЛ! Сейчас это интересный курс по программированию! Вместе с Симула.
Ах радости учебы в UNSW в конце 70-х годов! (- :
действительно, нет.существует около полумиллиона различных синтаксисов регулярных выражений; они, похоже, сводятся к Perl, EMACS/GNU и AT&T в целом, но я тоже всегда удивляюсь.
для PHP, "это всегда безопасно, чтобы предшествовать не буквенно-цифровой С"\", чтобы указать, что это означает для себя."- http://php.net/manual/en/regexp.reference.escape.php.
за исключением того, что это " или '. :/
чтобы избежать переменных шаблона регулярных выражений (или частичных переменных) в PHP используйте preg_quote ()
Comments