Почему нам нужно избегать! <>: = - в регулярных выражениях php?

http://php.net/manual/en/function.preg-quote.php:

Специальные символы регулярного выражения:.\+ *? [^] $() { знак равно < > |: -

Однако эта страница говорит, что специальные символы [ \ ^ $ . | ? * + ( )

Хорошо. Я знаю, что первая страница специально предназначена для регулярных выражений php. Однако почему нам нужно избежать !, <, >, :, =, -?

Я попытался сделать preg_match без экранирования <, >, - и !, и все работает отлично.

Ответ 1

Эти символы являются метасимволами, но им не требуется экранирование. Что общего у них, так это то, что они встречаются в специальных конструкциях группировки:

(?:...)      # non-capturing group
(?=...)      # positive lookahead
(?!...)      # negative lookahead
(?<name>...) # named capturing groups
(?<=...)     # positive lookbehind
(?<!...)     # negative lookbehind
(?>...)      # atomic group

Но в этом контексте они приобретают особое значение. Поэтому, если вы берете любую строку и избегаете всех этих символов: [\^$.|?*+(){, вы получите регулярное выражение, которое будет точно соответствовать символу строки символом, потому что эти другие метасимволы никогда не могут находиться в метаконтенте.

Например, ] является только метасимволом, если существовал предыдущий unescaped [, который открыл класс символов.

Аналогично, - является только метасимволом в символьном классе, что означает "диапазон", как в [a-z] (или буквальный -, как в [abc-].

Итак, чтобы избежать строки [tag-soup], вам просто нужно избежать [. Вне класса символов ] и - просто рассматриваются как литералы.

Итак, если вы берете строку и избегаете всех "безусловных" метасимволов ([\^$.|?*+(){), вы получаете регулярное выражение, которое будет точно соответствовать символу строки символом.

Ответ 2

Страница, на которую вы ссылаетесь, называется "базовый синтаксис regex". Существует ссылка на страницу под названием "расширенный синтаксис regex" . Здесь используются все дополнительные символы, которые вы указали.

  • ! используется для негативных обращений и lookbehinds
  • < используется для lookbehinds
  • > используется для атомных групп
  • : используется для установки флагов только для раздела регулярного выражения
  • = используется для позитивного просмотра и поиска.
  • - используется для диапазонов символов и корректировки флагов

Ответ 3

Тире - специальный символ внутри классов символов:

[a-zA-Z0-9]

Другие имеют значение внутри групп соответствия, например для lookahead/lookbehind:

(?<=foo)
(?!bar)

Я согласен с вами в том, что ничто из этого не нужно избегать. Как только скобки и квадратные скобки экранированы, эти другие символы теряют свое особое значение.

Ответ 4

Эти символы используются в выражениях с отрицательным/положительным внешним выражением/впереди/вокруг. Например:

/^foo(?<!z)bar$/

Подробнее см. здесь.

Ответ 5

Многие символы являются специальными только в определенном контексте. Из основных, несколько примеров:

 /-/       # dash
 /[a-z]/   # range
 /[-a-z]/  # a-z or dash

 /[^]/     # literal
 /^/       # meta-character

 /!/       # literal
 /(?!...)/ # meta-character