В регулярном выражении какие символы нужно экранировать?

23

Вообще, какие символы в регулярном выражении нужно экранировать?

Например, следующее не является синтаксически правильным:

echo '[]' | grep '[]'
grep: Unmatched [ or [^

Это, однако, является синтаксически правильным:

echo '[]' | grep '\[]'
[]

Есть ли документация о том, какие символы следует экранировать в регулярном выражении, а какие нет?

LanceBaynes
источник

Ответы:

12

Это зависит от приложения. В вашем примере [должны быть указаны в качестве аргумента, grepно не echo.

Для оболочки (из спецификации POSIX ):

Цитирование используется для удаления специального значения определенных символов или слов в оболочке. Заключение в кавычки может использоваться для сохранения буквального значения специальных символов в следующем абзаце, предотвращения распознавания зарезервированных слов как таковых и предотвращения расширения параметров и подстановки команд при обработке здесь-документа (см. Здесь-Документ).

Заявка должна указывать следующие символы, если они представляют себя:

|  &  ;  <  >  (  )  $  `  \  "  '  <space>  <tab>  <newline>

и следующее может потребоваться процитировать при определенных обстоятельствах. То есть эти символы могут быть специальными в зависимости от условий, описанных в другом месте этого тома IEEE Std 1003.1-2001:

*   ?   [   #   ˜   =   %

Различные механизмы цитирования - это escape-символы, одинарные и двойные кавычки. Здесь-документ представляет собой другую форму цитирования; см. здесь-документ.

Определенные программы (использующие регулярные выражения, perl, awk) могут иметь дополнительные требования по экранированию.

Matteo
источник
8

Каждое приложение будет иметь свой собственный набор «специальных» символов. Проблема, с которой вы столкнулись, была grepне в оболочке. О том, какие символы должны быть указаны в кавычках grep, читайте в разделе справочной страницы «РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ».

Для оболочки это символы, которые должны быть заключены в кавычки:

;'"`#$&*?[]<>{}\

и любые пробелы.

В зависимости от оболочки, другие символы также могут быть заключены в кавычки:

!^%

Посмотрите под "SHAM GRAMMAR" на странице руководства оболочки.

Arcege
источник
В некоторых оболочках с расширением истории ( bashвключено), !все еще развернутым в двойных кавычках, только одиночные кавычки будут останавливать его расширение (или отключать опцию оболочки).
Крис Даун
]не следует цитировать, [не всегда. Я не нашел никаких ссылок на {и}
Маттео
8

Существует несколько типов регулярных выражений, и набор специальных символов зависит от конкретного типа. Некоторые из них описаны ниже. Во всех случаях специальные символы экранируются обратной косой чертой \. Например, чтобы соответствовать [вы пишите \[вместо. В качестве альтернативы, символы (кроме ^) можно экранировать, заключив их в квадратные скобки один за другим, например [[].

Символы, которые являются специальными в некоторых контекстах, например ^специальные в начале (под) выражения, могут быть экранированы во всех контекстах.

Как писали другие: в оболочке, если вы не заключаете выражение между одинарными кавычками, вы должны дополнительно экранировать специальные символы для оболочки в уже экранированном регулярном выражении. Пример: вместо '\['вас можно написать \\[(альтернативно: "\["или "\\[") в Bourne-совместимых оболочках, таких как bash, но это уже другая история.

Основные регулярные выражения (BRE)

Расширенные регулярные выражения (ERE)

pabouk
источник
3

grepиспользует BRE в качестве метода регулярных выражений. Существует хорошая документация на него здесь , общее краткое изложение было бы «избежать каких - либо специальных символов или метасимволы , чтобы получить его буквального, побег , чтобы создать управляющие последовательности ( \n, \rи т.д.)», хотя это не всегда так, к примеру, вы должны убежать (и )получить их особое значение (обратная ссылка).

Крис Даун
источник
0

Оболочка может преобразовать командную строку перед выполнением команды. Обе оболочки и grepмогут использовать кавычки для удаления специального значения некоторых символов. Тем не менее grepи снаряды имеют разные специальные символы. Кроме того, неэкранированные специальные символы, которые не являются результатом существующего расширения, перед выполнением команды удаляются оболочкой.

echo '[]' | grep '[]'

Оболочка передает аргумент []в grepи анализируется как выражение с искаженной скобкой grep.

echo '[]' | grep \[]

Выше мы видим похожий случай. Обратная косая черта удаляется и []передается в качестве аргумента grep. grepраспознает искаженное выражение скобки.

echo '[]' | grep '\[]'

Наконец, в этом случае кавычки удаляются оболочкой и \[]передаются в качестве аргумента, grepно в данном конкретном случае \[is интерпретируется grepкак буквенная скобка. Кавычки необходимы для предотвращения интерпретации обратной косой черты как специального символа в оболочке.


¹ спецификации POSIX .

Fólkvangr
источник