การใช้งาน REGEX ส่วนใหญ่อยู่ที่ระดับความซับซ้อนได้อย่างไร


19

การใช้งานที่ทันสมัยที่สุดของการแสดงออกปกติเช่นใน Perl หรือ. NET ไปไกลกว่าคำนิยามวิทยาศาสตร์คอมพิวเตอร์คลาสสิกของ REGEX ด้วยคุณสมบัติเช่น lookahead และ lookbehind คุณสมบัติเหล่านี้ช่วยให้พวกเขาวิเคราะห์คำสั่งที่ไม่สามารถอธิบายได้ด้วยระบบออโตเมติกที่ จำกัด และไม่มีการพุชดาวน์หรือไม่? การเข้าใกล้ทัวริงสมบูรณ์มากแค่ไหนที่ทำให้พวกเขาสามารถทำได้


2
คำถามที่เกี่ยวข้องอย่างใกล้ชิด: เรามีอะไรที่น่าสนใจระหว่าง "regexes with backreferences" และ "regexes ที่สามารถมีรหัสโปรแกรมโดยพลการ"? ตัวอย่างเช่น regexes ที่มีbackreferences และ lookahead / lookbehindแสดงออกอย่างเข้มงวดมากขึ้นกว่า regexes ที่มี backreferences แต่ไม่มี lookahead / lookbehind? สิ่งที่เกี่ยวกับ "คำกริยาควบคุมการย้อนรอยพิเศษ" ใน Perl?
Jukka Suomela

ที่เกี่ยวข้อง (และอาจไม่ถูกต้อง): stackoverflow.com/questions/2974210/…
Aryabhata

คำตอบ:


18

ฉันไม่คิดว่าปัญหาที่แท้จริงคือคำถามของความหมายที่ไร้ขอบเขต นี่ไม่เลวร้ายไปกว่าสถานการณ์อื่น ๆ ในการแยกวิเคราะห์

ปัญหาอยู่ที่การกำหนดลักษณะการอ้างอิงย้อนกลับซึ่งทั้งสองทรงพลังและ จำกัด มาก: พวกมันอนุญาตให้อธิบายภาษาที่ไม่ใช้บริบทบางภาษาโดยไม่อนุญาตให้ใช้ภาษาที่ไม่มีบริบท ตัวอย่างเช่น regex (a*)b\1b\1จับคู่สตริงของรูปแบบและคุณสามารถใช้บทแทรกเพื่อแสดงสิ่งนี้ไม่ใช่ภาษาที่ไม่มีบริบท อย่างไรก็ตามในทางกลับกัน regexes ที่มีการอ้างอิงย้อนกลับดูเหมือนจะไม่เพียงพอที่จะจับคู่ภาษาของวงเล็บที่มีความสมดุลซึ่งเป็นภาษาที่ปราศจากบริบทananan

มันง่ายพอที่จะให้ความหมายเชิง denotational โดยบอกว่าสายอักขระมีอะไรในภาษาของ regexes แต่การให้คุณลักษณะของออโตมาตะเชิงทฤษฎีที่ดีนั้นดูท้าทายกว่ามาก มันเป็นเหมือนเครื่องลงทะเบียนซึ่งคุณสามารถคัดลอกสตริงย่อยของอินพุตของคุณและคุณสามารถใช้ทดสอบสตริงปัจจุบันของคุณกับสิ่งใดได้บ้าง แต่คุณไม่มีความสามารถในการปรับเปลี่ยนรีจิสเตอร์เหล่านี้

ผู้ที่ทำทฤษฎีแบบ จำกัด แน่นอนมีโมเดลของเครื่องจักรที่ขี้ขลาดและมันน่าสนใจที่จะรู้ว่าสิ่งนี้สอดคล้องกับโมเดลใดหรือไม่


9

/(.*)\1/L={WW|WΣ* * * *}WKLK={WW|WΣ* * * *,|W|≤K}K

แต่โดยหลักการแล้ว regexps ตามที่ระบุนั้นมีประสิทธิภาพมากกว่าภาษาปกติเนื่องจากคำถามที่เกี่ยวข้องนี้จะกล่าวถึงรายละเอียดเพิ่มเติม (ด้วยตัวอย่างที่ดีเช่นกัน)


จะไม่ {ww | w ∈Σ ∗, ∣w∣≤K} จะเป็นที่รู้จัก CSL หรือ TM ??
dhruvbird

arggh ควรทำเสร็จแล้ว ww ^ R จะแก้ไข ขอบคุณ
Suresh Venkat

ที่จริงฉันมีคำถามเกี่ยวกับเรื่องนี้ เป็น CSL หรือเป็นที่รู้จักกันดีหรือไม่? ฉันยังไม่สามารถหา LBA ได้ด้วยดังนั้นจึงสงสัยว่า ...
dhruvbird

1
{WW:WΣ* * * *}

5

ผลลัพธ์ที่น่าสนใจอย่างหนึ่งซึ่งนำมาจากคำถามอื่นที่เชื่อมโยงโดย Suresh Venkat ก็คือ regexps ที่ "ใช้งานได้" นั้นเป็นปัญหาที่สมบูรณ์และดังนั้นพวกเขาจึงควรมีอำนาจเทียบเท่ากับ SAT

การเป็นผู้เชี่ยวชาญที่ไม่ใช่ผู้เชี่ยวชาญในขณะที่ฉันยอมรับว่า "regexes กับ backreferences นั้นดูเหมือนจะไม่เพียงพอที่จะเข้ากับภาษาวงเล็บสมดุล" มีบางสิ่งแปลก ๆ เกิดขึ้น ปัญหาความสมบูรณ์ของ NP นั้นหมายถึงว่าปัญหา NP ใด ๆ ที่สามารถลดลงในพหุนามเป็น regexp ได้ดังนั้นอาจมีเพียงการลดพหุนามจากภาษา แต่อีกครั้งอาจมีบาง regexp ไร้สาระในการแยก CFL เนื่องจากพวกเขาสามารถแยกตัวเลขที่ไม่ใช่เอกนายก!

อาจเป็นบทเรียนที่ว่าคลาสความซับซ้อนและคลาสภาษานั้นไม่สามารถเทียบเคียงได้โดยทั่วไป ซึ่งยังแนะนำการใช้คำถามของคุณใหม่เพื่ออ้างอิงลำดับชั้นของ Chomsky มากกว่า "ระดับความซับซ้อน" (แม้ว่าจะยุติธรรมผมก็ไม่สับสนด้วย)

Charles Stewart เขียน:

Aho, 1990, "อัลกอริทึมสำหรับการค้นหารูปแบบในสตริง" แสดงให้เห็นว่าปัญหาความเป็นสมาชิกสำหรับภาษาปกติที่มีการย้อนรอยเสร็จสมบูรณ์นั้นเป็นปัญหาที่สมบูรณ์

บางส่วนแสดงตัวอย่าง (อย่างน้อยของคำสั่ง) สามารถพบได้บน Google หนังสือที่หน้า 289 และการอ้างอิงบรรณานุกรมกระดาษที่สามารถพบได้ที่นี่ โปรดทราบว่าในกระดาษ rewbr ย่อมาจาก Regular Expression With BackReferences


3

PCRE การใช้งาน "นิพจน์ทั่วไป" ที่ได้รับความนิยมมากที่สุดยังใช้รูปแบบการเรียกซ้ำซึ่งนอกเหนือไปจากการอ้างอิงย้อนกลับ คำถามเกี่ยวกับความซับซ้อนของพวกเขาเพิ่งถูกถามที่ Stackoverflow จากคำตอบที่เป็นประโยชน์เชิงลึกโดย Perl guru brian d foy สิ่งนี้ทำให้ PCRE มีประสิทธิภาพเท่ากับ grammars ที่ไม่มีบริบท อย่างไรก็ตามไวยากรณ์นั้นแย่มากเมื่อเทียบกับ Backus-Naur Form

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.