Чтобы знать, когда и что избегать без попыток, необходимо точно понимать цепочку контекстов, через которые проходит строка. Вы будете указывать строку от самой дальней стороны до ее конечного пункта назначения, которая является памятью, обработанной кодом синтаксического анализа регулярного выражения.
Помните, как обрабатывается строка в памяти: if может быть простой строкой внутри кода или строкой, введенной в командную строку, но может быть либо интерактивной командной строкой, либо командной строкой, указанной в сценарии оболочки файл, или внутри переменной в памяти, упомянутой кодом, или (строковым) аргументом при дальнейшей оценке, или строкой, содержащей код, сгенерированный динамически с любой инкапсуляцией ...
Каждому этому контексту назначено несколько символов со специальным функционалом.
Когда вы хотите передать символ буквально, не используя его специальную функцию (локальную для контекста), тогда вам нужно его экранировать для следующего контекста ... который может потребовать некоторых других escape-символов, которые могут дополнительно необходимо экранировать в предыдущем контексте (ах).
Кроме того, могут быть такие вещи, как кодировка символов (наиболее коварным является utf-8, потому что он выглядит как ASCII для общих символов, но может дополнительно интерпретироваться даже терминалом в зависимости от его настроек, поэтому он может вести себя по-другому, чем атрибут кодирования HTML / XML, необходимо правильно понимать процесс.
например. Регулярное выражение в командной строке, начинающееся с perl -npe
, должно быть перенесено в набор системных вызовов exec , соединяющихся как канал, который обрабатывает файл, каждый из этих системных вызовов exec просто имеет список аргументов, которые были разделенные пробелами (не экранированные) и, возможно, трубами (|) и перенаправлением (> N> N> & M), скобками, интерактивным расширением *
и ?
, $(())
... (все это специальные символы используется * sh, который может показаться, что мешает символу регулярного выражения в следующем контексте, но они оцениваются по порядку: перед командной строкой. Командная строка читается программой как bash / sh / csh / tcsh / zsh, по сути внутри двойной кавычки или одинарной кавычки, экранирование проще, но нет необходимости заключать в кавычки строку в командной строке, потому что в большинстве случаев пробел должен начинаться с обратной косой черты, а кавычка не требуется, оставляя доступной функциональность раскрытия для символов * и?, но этот синтаксический анализ такой же, как в цитате. Командная строка оценивается, регулярное выражение, полученное в памяти (не так, как записано в командной строке), получает ту же обработку, что и в исходном файле.
Для регулярных выражений в квадратных скобках [] есть контекст набора символов, регулярное выражение perl может быть заключено в большой набор не альфа-числовых символов (например, m // или m: / better / for / path: ...).
У вас есть более подробная информация о символах в другом ответе, которые очень специфичны для конечного контекста регулярного выражения. Как я уже отмечал, вы упоминаете, что вы находите escape-выражение с попытками, возможно, потому, что другой контекст имеет другой набор символов, который запутал вашу память о попытках (часто обратный слеш - это символ, используемый в этом другом контексте для экранирования литерального символа вместо его функции. ).