คำจำกัดความของการแสดงออกปกติคืออะไร?


10

ฉันเพิ่งได้เป็นข้อโต้แย้งที่เป็นมิตรกับGhotiเกี่ยวกับสิ่งที่ถือว่าเป็นนิพจน์ปกติในการแสดงความคิดเห็นเพื่อคำตอบของฉันนี้คำถาม ฉันอ้างว่าต่อไปนี้เป็นนิพจน์ทั่วไป:

`[Rr]eading[Tt]est[Dd]ata`

Ghoti ไม่เห็นด้วยอ้างว่าเป็นไฟล์ glob แทน globหน้าในการเรียกร้องที่วิกิพีเดีย (เหมืองเน้น):

Globs ไม่รวมไวยากรณ์สำหรับดาว Kleene ซึ่งอนุญาตการทำซ้ำหลายส่วนในส่วนก่อนหน้าของนิพจน์ ดังนั้นพวกเขาจึงไม่ถือว่าเป็นสำนวนปกติซึ่งสามารถอธิบายชุดของภาษาปกติที่มีขนาดใหญ่กว่าตัวอักษรที่ จำกัด ใด ๆ

อย่างไรก็ตามไม่มีการอ้างอิงสำหรับการอ้างสิทธิ์นี้ซึ่งระบุว่าเป็นเพียงความคิดเห็นของวิกิพีเดีย

เดี่ยวยูนิกซ์®ข้อมูลจำเพาะ, รุ่นที่ 2กล่าวว่าพื้นฐานนิพจน์ปกติ (BRE) สามารถแม้แต่จะเป็นตัวเดียว:

อักขระทั่วไปคือ BRE ที่ตรงกับตัวเอง: อักขระใด ๆ ในชุดอักขระที่สนับสนุนยกเว้นอักขระพิเศษ BRE ที่แสดงรายการในอักขระพิเศษ BRE

ดังนั้นคำจำกัดความของการแสดงออกปกติในโลก * คืออะไรและคำจำกัดความที่ไม่รวมไฟล์ globs?


6
ในทางทฤษฎี CS นิพจน์ทั่วไปคือคำอธิบายของภาษาปกติซึ่งเป็นภาษาที่สามารถรู้จำได้โดยหุ่นยนต์ จำกัด ในโลกของ Unix มันซับซ้อนกว่าและไม่มีคำจำกัดความใด ๆ มี 2 ภาษา regex ใน POSIX ข้อมูลจำเพาะ ได้แก่ : ขยายและพื้นฐานซึ่งจะถูกใช้โดยเครื่องมือชอบgrep, และsed awkVim ใช้ความหลากหลายของตัวเองเช่นเดียวกับ Perl
jw013

ดังนั้นตามนิยามแล้วไฟล์ glob คือ BRE ใช่ไหม
terdon

2
ไม่ไฟล์ glob ไม่ใช่ BRE - อะไรทำให้คุณคิดว่ามันคืออะไร? หากคุณอ่านคำอธิบาย POSIX ของ BRE และคำอธิบาย POSIX ของการวนรอบคุณจะสังเกตเห็นว่าพวกมันไม่เหมือนกัน ตัวอย่างเช่น*มีความหมายที่แตกต่างกันสองรายการใน BRE และ globs หมายเหตุ: ฉันไม่คิดว่าคำว่าglobถูกใช้ที่ใดก็ได้ในข้อมูลจำเพาะ POSIX - เรียกว่าการจับคู่รูปแบบแทนและอธิบายไว้ในบทภาษาของเชลล์
jw013

คำตอบ:


10

ในฐานะที่เป็น lk- กล่าวว่าตัวเลือกในการจะรักษาอาร์กิวเมนต์เป็น glob ไม่แสดงออกปกติ-namefind

ไม่ว่าสตริงจะถูกตีความว่าเป็น glob หรือ regex หรือเพียงแค่สตริงธรรมดาขึ้นอยู่กับสิ่งที่ถูกใช้ในการตีความ มันเป็นเรื่องของบริบท สตริงในตัวอย่างของคุณ[Rr]eading[Tt]est[Dd]ataสามารถได้รับการประเมินในหลายวิธีที่แตกต่างกัน แต่สิ่งที่มันเป็นขึ้นอยู่กับวิธีการที่คุณจะใช้มัน ใช้มันเป็น glob มันเป็น glob ใช้เป็น regex เป็น regex ในกรณีของคำถามที่สิ่งนี้เกิดขึ้น OP อธิบายถึงสตริงเป็น regex ดังนั้นเราสามารถสรุปได้ว่าเขากำลังวางแผนที่จะตีความมันเป็น regex

ตัวละครเดียวยังสามารถเป็น regex ได้อย่างแน่นอน มันอาจเป็นสตริงได้และมันก็อาจจะเป็นก้อนกลมได้ มันอาจตีความได้ว่าเป็นไบท์หรือจิ๋วจินท์หากคุณต้องการ ทุกอย่างขึ้นอยู่กับบริบท

มีข้อกำหนดจำนวนมากสำหรับนิพจน์ทั่วไปในรูปแบบต่างๆ BRE และ ERE ได้รับการบันทึกไว้เป็นอย่างดี PCRE เพิ่มฟังก์ชั่นการสแกน ล่าม regex จำนวนมากจะใช้งานเช่น "ทั้งหมดของ ERE และ PCRE บางส่วน" หรือพวกเขาจะทำ ERE ลบคุณลักษณะบางอย่าง หากคุณไปตามข้อกำหนดอย่างเป็นทางการเครื่องมือจำนวนมากเรียกร้องการสนับสนุน regex ที่ไม่ถูกต้องหรือไม่สมบูรณ์ การรู้รายละเอียดช่วยให้คุณสามารถปรับโซลูชันของคุณให้เข้ากับการรวบรวมการทำงานที่มีอยู่ในเครื่องมือใดก็ตามที่กำลังประเมิน regex ของคุณ

ดังนั้น ... หากคุณกำลังมองหาคำจำกัดความที่ "แยก" globs คุณกำลังดูสิ่งนี้จากมุมมองที่ผิด สิ่งที่มันจะถูกกำหนดโดยวิธีการที่คุณใช้มัน


7

[Rr]eading[Tt]est[Dd]ataดูเหมือนจะใช้ได้ทั้งแบบกลมและแบบปกติและฉันเชื่อว่ามี "ความหมาย" เดียวกันในการตีความทั้งสองแบบ อย่างไรก็ตาม-nameตัวเลือกของfindจะถือว่าอาร์กิวเมนต์เป็นกลมไม่ใช่การแสดงออกปกติ

ความแตกต่างนี้จะมีความสำคัญหากคุณให้ข้อโต้แย้งเช่นfoo*ซึ่งเป็นทั้ง glob ที่ถูกต้องและการแสดงออกปกติที่ถูกต้อง แต่มีความหมายที่แตกต่างกันขึ้นอยู่กับการตีความ:

หากตีความว่าเป็นรูปแบบ glob นี้จะตรงกับfoo, foobar, foo123ฯลฯ

หากตีความว่าเป็นนิพจน์ปกตินี้จะตรงกับfo, foo, fooooooฯลฯ


ขอบคุณฉันเห็นความแตกต่างระหว่างรูปแบบ glob และ regex ความหมายอย่างเป็นทางการของ regex คืออะไร?
terdon

1
ฉันไม่ทราบว่ามีคำจำกัดความเดียวสำหรับ "นิพจน์ทั่วไป" เนื่องจากเป็นคำที่ใช้กันทั่วไป มีข้อกำหนดทางไวยากรณ์ที่แตกต่างกันเช่นนิพจน์ปกติ POSIX หรือนิพจน์ปกติ Perl ซึ่งรวมถึง "คุณสมบัติ" อื่น ๆ เช่นการอ้างอิงย้อนกลับหรือ lookaheads สิ่งเหล่านี้อาจไม่ใช่การแสดงออกปกติในความหมายที่เข้มงวดที่สุด (ในบริบทของภาษาทางการทั่วไป) แต่ยังคงถูกอ้างถึงเช่นนี้
lk-
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.