Itu karena alasan historis.
Regexp pertama kali diperkenalkan di Unix di edutilitas pada awal 70-an. Meskipun eddidasarkan pada qedyang pelaksanaannya oleh penulis yang sama dipahami regexp lebih kompleks, edhanya dipahami ^, $, [...], ., *dan \untuk melarikan diri semua hal di atas.
Sekarang, ketika kebutuhan untuk memiliki lebih banyak operator muncul, cara harus ditemukan untuk memperkenalkan mereka tanpa merusak kompatibilitas. Jika skrip digunakan untuk menggunakan s edperintah s/foo() {/foo (var) {/guntuk mengganti semua instance foo() {dengan foo(var) { dan Anda memperkenalkan (atau {operator, itu akan merusak skrip itu.
Namun tidak ada skrip yang akan dilakukan s/foo\(\) {/foo\(var\) {/, karena itu sama dengan s/foo() {/foo(var) {/dan tidak ada alasan untuk melarikan diri (karena itu bukan operator RE. Jadi memperkenalkan operator baru \(atau \{tidak merusak kompatibilitas karena sangat tidak mungkin untuk memecahkan skrip yang ada menggunakan sintaks yang lebih lama.
Jadi, itulah yang dilakukan. Kemudian, \(...\)ditambahkan pada awalnya hanya untuk s edperintah untuk melakukan hal-hal seperti s/foo\(.\)/\1bar/dan kemudian sebagai grep '\(.\)\1'(tetapi bukan hal-hal seperti \(xx\)*).
Dalam UnixV7 (1979, hampir satu dekade kemudian), bentuk baru ekspresi reguler ditambahkan dalam utilitas baru egrepdan awkdisebut extended regular expression (karena mereka adalah alat baru, tidak ada kompatibilitas mundur yang harus dilanggar). Akhirnya, ia menyediakan fungsionalitas yang tersedia di Ken Thompson kuno qed(operator pergantian |, pengelompokan (..)*) dan menambahkan beberapa operator seperti +dan ?(tetapi tidak memiliki fitur backref dari ekspresi reguler dasar).
Kemudian BSD ditambahkan \<dan \>(ke BRE dan ERE), dan SysV ditambahkan \{dan \}ke BRE saja.
Tidak sampai lebih lama dari {dan }ditambahkan ke ERE, dengan melanggar kompatibilitas ke belakang. Tidak semua orang menambahkannya. Misalnya, GNU awkhingga versi 4.0.0 (2011) tidak mendukung {kecuali dipaksa ke mode kesesuaian POSIX.
ketika GNU grepditulis pada awal 90-an, ia menambahkan semua barang dari BSD dan SysV (seperti \<, {) dan alih-alih memiliki dua sintaks dan mesin regexp terpisah untuk BRE dan ERE, mengimplementasikan operator yang sama di keduanya, hanya rekan-rekan BRE dari (, ?, {, +harus didahului dengan backslash (agar kompatibel dengan implementasi lainnya BRE). Itu sebabnya Anda dapat melakukannya .\+di GNU grep(meskipun itu bukan POSIX atau didukung oleh implementasi lain) dan Anda dapat melakukannya (.)\1di GNU egrep(meskipun itu bukan POSIX atau didukung oleh banyak implementasi lain termasuk GNU awk).
Menambahkan \xoperator bukan satu-satunya cara untuk menambahkan lebih banyak operator dengan cara yang kompatibel mundur. Misalnya perldigunakan (?...). Itu masih kompatibel dengan EREs karena (?=...)tidak berlaku di EREs, sama untuk .*?. vimuntuk operator serupa melakukannya secara berbeda dengan memperkenalkan \@=atau .\{-}misalnya.