[[.ch.]] หมายถึงอะไรใน regex?


11

ชื่อสำรอง: "ลำดับการเรียง" หรือ "องค์ประกอบเรียง" ใน regex ที่สอดคล้องกับ POSIX คืออะไร

ฉันพบข้อกำหนดทางเทคนิคที่แน่นอนในส่วน 9.3.5 ของข้อกำหนด POSIXตามรายการ # 4 ในรายการ แต่ไม่ชัดเจนสำหรับฉัน

ฉัน googled รอบบนเว็บสำหรับตัวอย่างและคำอธิบายและมาไม่สมบูรณ์มือเปล่า แต่ที่แน่ ๆ ไม่ได้รู้แจ้ง

สิ่งเดียวที่ฉันได้รับคือในบางสถานการณ์คุณสามารถทำให้ regex ปฏิบัติกับตัวละครหลาย ๆ ตัวราวกับเป็นตัวละครเดียวเพื่อการเปรียบเทียบความยาวและกำหนดว่า "การจับคู่ที่ยาวที่สุด" คืออะไร (เนื่องจาก regexes เป็นโลภและ ส่งคืนการจับคู่ที่ยาวที่สุดที่เป็นไปได้)

นั่นคือทั้งหมดใช่มั้ย ฉันมีปัญหาในการเห็นการใช้งาน แต่ฉันสงสัยว่าความเข้าใจของฉันไม่สมบูรณ์ สิ่งที่จริง "เรียง" สำหรับ regex คืออะไร? และ[[.ch.]]ตัวอย่างใน POSIX specs เกี่ยวข้องกับสิ่งนี้อย่างไร

คำตอบ:


7

องค์ประกอบการเรียงมักจะอ้างอิงในบริบทของการเรียงลำดับ

ในหลายภาษาการเรียง (การเรียงลำดับเหมือนในพจนานุกรม) ไม่เพียง แต่ทำต่อตัวอักษรเท่านั้น ตัวอย่างเช่นในภาษาเช็กchไม่ได้เรียงลำดับcgและciชอบในภาษาอังกฤษ แต่ถือเป็นการเรียงลำดับโดยรวม มันเป็นองค์ประกอบเรียง (เราสามารถได้หมายถึงตัวละครที่นี่ตัวละครที่เป็นส่วนหนึ่งขององค์ประกอบเรียง) ที่ทุกประเภทในระหว่างและhi

ตอนนี้คุณอาจถามว่าสิ่งที่เกี่ยวข้องกับการแสดงออกปกติ? , ทำไมฉันจะต้องการที่จะอ้างถึงองค์ประกอบเรียงในการแสดงออกวงเล็บ? .

ภายในนิพจน์วงเล็บเหลี่ยมเราใช้คำสั่ง ยกตัวอย่างเช่นใน[c-j]คุณต้องการให้ตัวละครในระหว่างและc jคุณล่ะ คุณต้องการให้เรียงองค์ประกอบที่นั่น [h-i]ในการแข่งขันภาษาเช็กch:

$ echo cho | LC_ALL=cs_CZ.UTF-8 grep '^[h-i]o'
cho

ดังนั้นหากคุณสามารถแสดงช่วงขององค์ประกอบการเรียงในนิพจน์วงเล็บปีกกาคุณก็คาดหวังว่าจะสามารถแสดงรายการองค์ประกอบเหล่านั้นทีละรายการได้เช่นกัน [a-cch]จะตรงกับว่าองค์ประกอบเรียงในระหว่างaและcและcและhตัวอักษร ในการมีa-cและchอิลิเมนต์การเรียงเราต้องการไวยากรณ์ใหม่:

$ echo cho | LC_ALL=cs_CZ.UTF-8 grep '^[a-c[.ch.]]o'
cho

(คนในระหว่างaและcและchหนึ่ง)

ตอนนี้โลกยังไม่สมบูรณ์แบบและอาจจะไม่เคย ตัวอย่างข้างต้นเป็นในระบบ GNU และทำงานได้ ตัวอย่างของอีกองค์ประกอบเรียงอาจจะeด้วยสำเนียงเฉียบพลันรวม UTF-8 ( $'e\u0301'แสดงผลเหมือน$'\u00e9'เป็นé)

éและéเป็นตัวละครเดียวกันยกเว้นตัวหนึ่งจะถูกแทนด้วยตัวละครตัวหนึ่งและอีกตัวที่มีสองตัว

$ echo $'e\u301t\ue9' | grep '^[d-f]t'

จะทำงานได้อย่างถูกต้องในบางระบบ แต่ไม่ใช่ระบบอื่น (ไม่ใช่ GNU เป็นต้น) และมันก็ไม่มีความชัดเจนว่า$'[[.\ue9.]]'ควรจะตรงเท่านั้น$'\ue9'หรือทั้งสองอย่างและ$'\ue9'$'e\u301'

ไม่พูดถึงสคริปต์ที่ไม่ใช่ตัวอักษรหรือสคริปต์ที่มีคำสั่งเรียงลำดับภูมิภาคการเรียงลำดับสิ่งต่าง ๆ เช่น ffi ( ffiในอักขระหนึ่งตัว) ซึ่งกลายเป็นเรื่องยุ่งยากในการจัดการกับ API อย่างง่าย


1

นี่เป็นประโยชน์เมื่อมีการใช้อักขระที่ไม่ใช่ภาษาอังกฤษ (ไม่ใช่ ASCII) ตัวอย่างที่chคุณพูดถึงคือdigraphนั่นคือบางภาษามีตัวอักษรในตัวอักษรของพวกเขาที่ / สามารถแสดงด้วยตัวอักษรสองตัวในตัวอักษรภาษาอังกฤษ

เมื่อคุณใช้[.ch.]ใน regexp โดยทั่วไปคุณจะพูดว่า: "ฉันคาดว่าลำดับการป้อนข้อมูลที่ไม่ใช่ภาษาอังกฤษกับ digraph chฉันต้องการให้ regexp ของฉันตรงกับ charachter เดียวchภาษาโปรแกรม / regex engine / คีย์บอร์ดของฉันไม่อนุญาตให้ฉันเขียน digraph นี้ ลงชื่อเข้าใช้ดังนั้นฉันจึงพิมพ์[.ch.]ฉันไม่ได้หมายcตามมาด้วยhโปรดหาสิ่งที่ปรากฏของ digraph เป็น charachter เดียวเท่านั้น "

[[.ch.]]หมายความว่า digraph เป็นส่วนหนึ่งของชุดอักขระ ในกรณีนี้มีเพียงหนึ่งตัวจริง เพียงสัญกรณ์ regexp มาตรฐาน


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