มันทำงานยังไง?
ดูทฤษฎีออโตมาตะ
กล่าวโดยสรุปแต่ละนิพจน์ทั่วไปมีออโต้ จำกัด ที่เท่ากันและสามารถคอมไพล์และปรับให้เหมาะกับออโตเมติก จำกัด อัลกอริทึมที่เกี่ยวข้องสามารถพบได้ในหนังสือรวบรวมหลายเล่ม อัลกอริทึมเหล่านี้ถูกใช้โดยโปรแกรมยูนิกซ์เช่น awk และ grep
อย่างไรก็ตามภาษาการเขียนโปรแกรมที่ทันสมัยที่สุด (Perl, Python, Ruby, Java (และภาษาที่ใช้ JVM), C #) ไม่ได้ใช้วิธีการนี้ พวกเขาใช้วิธีการย้อนรอยซ้ำซึ่งรวบรวมการแสดงออกปกติลงในต้นไม้หรือลำดับของการสร้างที่เป็นตัวแทนของชิ้นย่อยต่างๆของการแสดงออกปกติ ไวยากรณ์ "นิพจน์ทั่วไป" ที่ทันสมัยส่วนใหญ่นำเสนอการอ้างอิงย้อนกลับซึ่งอยู่นอกกลุ่มของภาษาปกติ (ไม่มีการแสดงแทนในขอบเขตออโตมาตะ) ซึ่งสามารถนำไปใช้งานได้เล็กน้อยในแนวทางย้อนรอยแบบวนซ้ำ
การปรับให้เหมาะสมมักจะให้เครื่องสถานะที่มีประสิทธิภาพมากขึ้น ตัวอย่างเช่นพิจารณา aaaab | aaaac | aaaad โปรแกรมเมอร์ทั่วไปสามารถใช้งานการค้นหาที่เรียบง่าย แต่มีประสิทธิภาพน้อยกว่า (เปรียบเทียบสามสตริงแยกกัน) ในเวลาสิบนาที แต่การตระหนักว่ามันเทียบเท่ากับ aaaa [bcd] การค้นหาที่ดีสามารถทำได้โดยค้นหาสี่ตัวแรก 'a' จากนั้นทดสอบอักขระตัวที่ 5 กับ [b, c, d] กระบวนการปรับให้เหมาะสมเป็นหนึ่งในคอมไพเลอร์ที่บ้านของฉันทำงานเมื่อหลายปีก่อนดังนั้นฉันคิดว่ามันยังอยู่ในเอ็นจิ้นนิพจน์ทั่วไปที่ทันสมัยที่สุด
ในทางตรงกันข้ามเครื่องจักรของรัฐมีข้อได้เปรียบบางอย่างเมื่อพวกเขายอมรับสตริงเนื่องจากใช้พื้นที่มากกว่าเมื่อเทียบกับ "การใช้งานเล็กน้อย" พิจารณาโปรแกรมที่จะยกเลิกคำสั่ง escape บนสตริง SQL นั่นคือ: 1) เริ่มต้นและสิ้นสุดด้วยเครื่องหมายคำพูดเดี่ยว 2) เครื่องหมายอัญประกาศเดี่ยวจะถูกหลีกเลี่ยงโดยการเสนอราคาสองครั้งติดต่อกัน ดังนั้น: อินพุต ['a' ''] ควรให้ผลลัพธ์ [a '] ด้วยเครื่องสถานะเครื่องหมายอัญประกาศเดี่ยวติดต่อกันได้รับการจัดการโดยสองสถานะ ทั้งสองสถานะนี้มีจุดประสงค์ในการจดจำประวัติอินพุตเช่นว่าอักขระอินพุตแต่ละตัวจะถูกประมวลผลเพียงครั้งเดียวเท่านั้นดังแสดงในรูปต่อไปนี้:
...
S1->'->S2
S1->*->S1, output *, * can be any other character
S2->'->S1, output '
S2->*->END, end the current string
ดังนั้นในความคิดของฉันการแสดงออกปกติอาจช้าลงในบางกรณีเล็กน้อย แต่มักจะเร็วกว่าอัลกอริทึมการค้นหาที่สร้างขึ้นด้วยตนเองเนื่องจากความจริงที่ว่าการเพิ่มประสิทธิภาพไม่สามารถทำได้อย่างน่าเชื่อถือโดยมนุษย์
(แม้แต่ในกรณีเล็ก ๆ น้อย ๆ เช่นการค้นหาสตริงสมาร์ทเอ็นจิ้นสามารถจดจำเส้นทางเดียวในแผนที่สถานะและลดส่วนนั้นลงเป็นการเปรียบเทียบสตริงอย่างง่ายและหลีกเลี่ยงการจัดการสถานะ)
เอ็นจินเฉพาะจากเฟรมเวิร์ก / ไลบรารีอาจช้าเนื่องจากเอ็นจินทำสิ่งอื่น ๆ ที่โปรแกรมเมอร์ไม่ต้องการ ตัวอย่าง: คลาส Regex ใน. NET สร้างกลุ่มวัตถุรวมถึงการจับคู่กลุ่มและการจับภาพ