Как обратная косая черта влияет на фигурные скобки в регулярных выражениях? - PullRequest
4 голосов
/ 15 июня 2019

Итак, я начал изучать regex , используя grep и sed в Linux, и я не понимаю, почему я должен сохранять фигурные скобки? Таким образом, сохранение означает экранирование символов для буквального совпадения с ними, но когда я набираю grep 'test{2}', оно будет совпадать только с test{2}, а когда я печатаю 'test\{2\}', оно будет совпадать с testtest. Это нормально, но почему обратный слеш имеет другое применение с другими модификаторами? Например, в случае . (точка), когда я набираю test., он будет соответствовать любому тексту с тестом, за которым следуют любые символы. В этом случае нам нужен обратный слеш, чтобы интерпретировать его как символ. Поэтому, когда я использую это так: test\. это будет соответствовать только test.

Итак, подведем итог: почему в случае { обратная косая черта сохраняет фигурные скобки для интерпретации как символ, а в случае других модификаторов, например . обратная косая черта сохраняет символ для интерпретации как особый. ..

Я знаю, это звучит смешно, но я не понимаю ...

1 Ответ

1 голос
/ 26 июня 2019

Когда grep используется без -E, вам необходимо экранировать ("сохранить") скобки, которые являются квантификаторами, поскольку используется регулярное выражение: POSIX BRE :

grep 'test\{2\}' file # => Finds lines having testt, not testtest

и

grep '\(test\)\{2\}' file # => Finds lines having testtest

Идентичные POSIX ERE варианты

grep -E 'test{2}' file
grep -E '(test){2}' file

Другой пример - сопоставление фигурных скобок:

grep '{2}' file # => matches lines having {2} in them
grep -E '\{2}' file => same, note the } is not special

См. подробнее о стандарте BRE и ERE POSIX regex .

Различия между синтаксисом BRE и ERE POSIX просто исторические, и, похоже, за этим нет особой идеи.

...