Чтобы понять, когда и что избегать без попыток, необходимо точно понимать цепочку контекстов, через которые проходит строка. Вы будете указывать строку от самой дальней стороны до ее конечного пункта назначения, которая является памятью, обработанной кодом синтаксического анализа регулярного выражения.
Помните, как обрабатывается строка в памяти: если это может быть простая строка внутри кода или строка, введенная в командную строку, но может быть либо интерактивной командной строкой, либо командной строкой, указанной в файле сценария оболочки, или внутри переменной в памяти, упомянутой кодом, или (строковым) аргументом при дальнейшей оценке, или строкой, содержащей код, сгенерированный динамически с любой инкапсуляцией ...
Каждому из этого контекста назначено несколько символов со специальным функционалом.
Если вы хотите передать символ буквально, не используя его специальную функцию (локальную для контекста), тогда вам нужно его экранировать для следующего контекста ... который может потребовать некоторых других 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-выражение с попытками, возможно, потому, что другой контекст имеет другой набор символов, который запутал вашу память о попытках (часто обратный слеш - это символ, используемый в этом другом контексте для экранирования литерального символа вместо его функции. ).
escape()
", позволяющие использовать произвольные строки в качестве частей регулярных выражений.