Це з історичних причин.
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
для подібних операторів це було інакше, вводячи \@=
або, .\{-}
наприклад.