นั่นคือเหตุผลทางประวัติศาสตร์
Regexp เปิดตัวครั้งแรกใน Unix ในedยูทิลิตี้ในช่วงต้นยุค 70 แม้ว่าจะedอยู่บนพื้นฐานqedที่มีการดำเนินการโดยผู้เขียนเดียวกันเข้าใจ regexp ที่ซับซ้อนมากขึ้นedเท่านั้นเข้าใจ^, $, [...], ., *และ\จะหลบหนีทั้งหมดข้างต้น
ตอนนี้เมื่อจำเป็นต้องมีตัวดำเนินการเพิ่มขึ้นต้องหาวิธีที่จะแนะนำตัวดำเนินการเหล่านั้นโดยไม่ทำลายความเข้ากันได้แบบย้อนหลัง หากสคริปต์ที่ใช้ในการใช้s edคำสั่งs/foo() {/foo (var) {/gเพื่อแทนที่อินสแตนซ์ทั้งหมดfoo() {ด้วยfoo(var) { และคุณได้แนะนำตัวดำเนินการ(หรือ{ตัวดำเนินการนั่นจะทำให้สคริปต์นั้นพัง
อย่างไรก็ตามไม่มีสคริปต์ที่จะทำs/foo\(\) {/foo\(var\) {/เพราะนั่นเป็นสิ่งเดียวกันs/foo() {/foo(var) {/และไม่มีเหตุผลที่จะหลบหนี(เพราะนั่นไม่ใช่ตัวดำเนินการ RE ดังนั้นการแนะนำตัวใหม่\(หรือ\{โอเปอเรเตอร์จะไม่ทำลายความเข้ากันได้แบบย้อนหลังเนื่องจากมันไม่น่าจะทำลายสคริปต์ที่มีอยู่โดยใช้ไวยากรณ์ที่เก่ากว่า
นั่นคือสิ่งที่ทำ ต่อมา\(...\)ถูกเพิ่มเข้ามาในตอนแรกเท่านั้นสำหรับs edคำสั่งให้ทำสิ่งต่าง ๆ เช่นs/foo\(.\)/\1bar/และในภายหลังเป็นgrep '\(.\)\1'(แต่ไม่ใช่สิ่งที่ต้องการ\(xx\)*)
ใน UnixV7 (1979 เกือบทศวรรษต่อมา) รูปแบบใหม่ของการแสดงออกปกติถูกเพิ่มเข้ามาในรูปแบบใหม่egrepและawkยูทิลิตี้ที่เรียกว่าการแสดงออกปกติเพิ่มเติม (เนื่องจากเป็นเครื่องมือใหม่ไม่มีความเข้ากันได้แบบย้อนกลับ) ในที่สุดมันก็มาพร้อมกับฟังก์ชั่นที่มีอยู่ใน Ken Thompson ของโบราณqed(ตัวดำเนินการสำรอง|, การจัดกลุ่ม(..)*) และเพิ่มตัวดำเนินการบางอย่างที่ชอบ+และ?(แต่ไม่มีคุณสมบัติ backref ของการแสดงออกปกติพื้นฐาน)
ภายหลัง BSDs เพิ่ม\<และ\>(ทั้ง BRE และ ERE) และ SysV เพิ่ม\{และ\}BREs เท่านั้น
มันไม่ได้ช้าไปกว่า{และ}ถูกเพิ่มเข้าใน ERE ด้วยการใช้งานร่วมกันได้แบบย้อนกลับ ไม่ใช่ทุกคนที่เพิ่มเข้าไป ตัวอย่างเช่น GNU awkจนถึงรุ่น 4.0.0 (2011) ไม่รองรับ{เว้นแต่จะถูกบังคับให้เข้าสู่โหมดความสอดคล้อง POSIX
เมื่อ GNU grepเขียนขึ้นในช่วงต้นยุค 90 มันเพิ่มสารพัดทั้งหมดจากทั้ง BSD และ SysV (เช่น\<, {) และแทนที่จะมีไวยากรณ์ regexp สองอันแยกต่างหากและเอ็นจิ้นสำหรับ BRE และ ERE ดำเนินการตัวดำเนินการเดียวกันทั้งคู่เท่านั้น(, ?, {, +ต้องนำหน้าด้วยเครื่องหมายทับขวา (จะเข้ากันได้กับการใช้งานอื่น ๆ BRE) นั่นเป็นเหตุผลที่คุณสามารถทำได้.\+ใน GNU grep(แม้ว่าจะไม่ใช่ POSIX หรือสนับสนุนโดยการใช้งานอื่น ๆ ) และคุณสามารถทำได้(.)\1ใน GNU egrep(แม้ว่าจะไม่ใช่ POSIX หรือสนับสนุนโดยการใช้งานอื่น ๆ รวมถึง GNU awk)
การเพิ่ม\xตัวดำเนินการไม่ใช่วิธีเดียวในการเพิ่มตัวดำเนินการเพิ่มเติมในวิธีที่เข้ากันได้แบบย้อนหลัง ยกตัวอย่างเช่นใช้perl (?...)ที่ยังคงเข้ากันได้กับ Eres เป็น(?=...)ไม่ถูกต้องใน Eres .*?เดียวกันสำหรับ vimสำหรับผู้ประกอบการที่คล้ายกันทำแตกต่างกันโดยการแนะนำ\@=หรือ.\{-}ยกตัวอย่างเช่น