Це з історичних причин.
Regexp були вперше представлені в Unix edутилітою на початку 70-х. Хоча edбув заснований на qedздійснення яких з тих же авторів розуміється більш складне регулярний вираз, edтільки зрозумів ^, $, [...], ., *і , \щоб уникнути всього перерахованого вище.
Тепер, коли виникла потреба мати більше операторів, треба було знайти спосіб їх впровадження, не порушуючи зворотної сумісності. Якщо скрипт , який використовується , щоб використовувати s edкоманду , як s/foo() {/foo (var) {/gзамінити всі екземпляри foo() {з , foo(var) { і ви ввели (або {оператора, що б розірвати цей сценарій.
Однак жоден сценарій не зробив би це s/foo\(\) {/foo\(var\) {/, оскільки це те саме, що s/foo() {/foo(var) {/і не було підстав для втечі, (оскільки це не було оператором РЕ. Таким чином, введення нового \(або \{оператора не порушує зворотну сумісність, оскільки малоймовірно зламати існуючий сценарій, використовуючи старіший синтаксис.
Отже, ось що було зроблено. Пізніше, \(...\)спочатку додавали лише s edкоманду виконувати такі речі, як s/foo\(.\)/\1bar/і пізніше grep '\(.\)\1'(але не підвіконня \(xx\)*).
У UnixV7 (1979, так що майже через десятиліття пізніше) у новій формі додано нову форму регулярних виразів, egrepа awkутиліти називають розширеним регулярним виразом (оскільки вони є новими інструментами, зворотна сумісність не може бути порушена). Нарешті, він забезпечив функціонал, доступний у стародавньому Кена Томпсона qed(оператор чергування |, групування (..)*) і додав декілька операторів, як +і ?(але не мав функції backref для основних регулярних виразів).
Пізніше BSD додали \<і \>(і BRE і ERE), і SysV додали \{і \}лише BRE .
Це не не набагато пізніше , ніж {та }були додані до ERE, такий розрив зворотної сумісності. Не всі додали його. Наприклад, GNU awkдо версії 4.0.0 (2011) не підтримував, {якщо не був примушений до режиму відповідності POSIX.
коли GNU grepбув написаний на початку 90-х, він додав усі смаколики як BSD, так і SysV (наприклад \<, {) і замість того, щоб мати два окремих синтаксису regexp і двигун для BRE і ERE, реалізував ті самі оператори в обох, лише BRE аналоги (, ?, {, +повинні передувати зі зворотним косою риси (щоб бути сумісним з іншими реалізаціями BRE). Ось чому ви можете робити .\+в GNU grep(хоча це не POSIX або підтримується іншими реалізаціями), а ви можете робити (.)\1в GNU egrep(хоча це не POSIX або підтримується багатьма іншими реалізаціями, включаючи GNU awk).
Додавання \xоператорів - не єдиний спосіб додати більше операторів у зворотно сумісний спосіб. Наприклад, perlвживаний (?...). Це все ще відстало, сумісне з ERE, оскільки (?=...)це не справедливо для ERE, те ж саме .*?. vimдля подібних операторів це було інакше, вводячи \@=або, .\{-}наприклад.