Эти персонажи являются метасимволами, но им не нужно убегать.Общим для них является то, что они встречаются в специальных группирующих конструкциях:
(?:...) # non-capturing group
(?=...) # positive lookahead
(?!...) # negative lookahead
(?<name>...) # named capturing groups
(?<=...) # positive lookbehind
(?<!...) # negative lookbehind
(?>...) # atomic group
Но в этом контексте они приобретают только особое значение.Поэтому, если вы берете любую строку и экранируете все эти символы: [\^$.|?*+(){
, вы получаете регулярное выражение, которое будет точно соответствовать строке символ за символом, потому что эти другие метасимволы никогда не могут находиться в мета-контексте.
Например, ]
является только метасимволом, если был предыдущий неэкранированный [
, открывший класс символов.
Аналогично, -
- это только метасимвол в классе символов, что означает «диапазон», как в [a-z]
(или литерал -
, как в [abc-]
.
Таким образом, для экранирования строки [tag-soup]
вам просто нужно экранировать [
. За пределами класса символов ]
и -
просто рассматриваются как литералы.
В итоге, если вы берете строку и экранируете все «безусловные» метасимволы ([\^$.|?*+(){
), то вы получаете регулярное выражение, которое будет точно соответствовать строке символ за символом.