นั่นคือเหตุผลทางประวัติศาสตร์
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
สำหรับผู้ประกอบการที่คล้ายกันทำแตกต่างกันโดยการแนะนำ\@=
หรือ.\{-}
ยกตัวอย่างเช่น