-
TRRE: นิพจน์เรกิวลาร์แบบแปลง
-
สรุป
- เป็นส่วนขยายของนิพจน์เรกิวลาร์สำหรับการแก้ไขข้อความและเครื่องมือบรรทัดคำสั่งที่คล้าย
grep
- เป็นเพียงต้นแบบ จึงไม่ควรนำไปใช้ในสภาพแวดล้อมจริง
-
แนะนำ
- นิพจน์เรกิวลาร์เป็นเครื่องมือที่มีประโยชน์สำหรับการค้นหารูปแบบในข้อความ
- ผู้เขียนรู้สึกว่าเมื่อนำมาใช้กับการแก้ไขข้อความแล้วมันไม่ค่อยเป็นธรรมชาติ จึงเสนอส่วนขยายนี้ขึ้นมา
- เรียกว่า นิพจน์เรกิวลาร์แบบแปลง หรือ
trre
- ใช้สัญลักษณ์
: เพื่อกำหนดการแปลง
a:b คือรูปแบบที่ง่ายที่สุด โดยแทนที่ a ด้วย b
- มีการสร้างเครื่องมือบรรทัดคำสั่งชื่อ
trre เพื่อสาธิตแนวคิดนี้
-
ตัวอย่าง
-
พื้นฐาน
- เปลี่ยน
cat เป็น dog:
$ echo 'cat' | trre 'c:da:ot:g'
dog
- แทนที่ทุกตำแหน่งที่ตรงกันของสตริงเหมือน
sed:
$ echo 'Mary had a little lamb.' | trre '(lamb):(cat)'
Mary had a little cat.
- ลบ:
$ echo 'xor' | trre '(x:)or'
or
- แทรก:
$ echo 'or' | trre '(:x)or'
xor
-
นิพจน์เรกิวลาร์ผ่านการแปลง
-
การแปลงช่วง
-
ตัวสร้าง
-
ข้อกำหนดของภาษา
trre ถูกนิยามเป็นคู่ของ รูปแบบที่ใช้จับคู่:รูปแบบที่ใช้สร้าง
รูปแบบที่ใช้จับคู่ อาจเป็นสตริงหรือนิพจน์เรกิวลาร์ก็ได้
รูปแบบที่ใช้สร้าง โดยทั่วไปเป็นสตริง แต่ก็อาจเป็น regex ได้เช่นกัน
-
ทำไมมันถึงทำงานได้
trre สร้างออโตมาตาชนิดพิเศษที่เรียกว่า finite-state transducer (FST)
- FST จัดการกับคู่ของอินพุต-เอาต์พุต
-
ทางเลือกในการออกแบบและคำถามที่ยังเปิดอยู่
- ต้องมีการตัดสินใจหลายอย่าง เช่น associativity ของ
:, ลำดับความสำคัญ และ epsilon โดยนัย
-
โหมดและความละโมบ
trre รองรับสองโหมด:
- โหมดสแกน (ค่าเริ่มต้น): ใช้การแปลงตามลำดับ
- โหมดจับคู่: ตรวจสอบทั้งสตริงกับนิพจน์
-
การทำให้เป็นแบบกำหนดแน่นอน
- กระบวนการแปลงออโตมาตาแบบไม่กำหนดแน่นอนให้เป็นแบบกำหนดแน่นอนมีความสำคัญ
-
ประสิทธิภาพ
- เวอร์ชัน NFT (ไม่กำหนดแน่นอน) ช้ากว่า
sed เล็กน้อย
- ในงานที่ซับซ้อน
trre_dft (เวอร์ชันกำหนดแน่นอน) อาจทำงานได้ดีกว่า sed
-
TODO
- ทำชุดความสามารถ ERE ให้สมบูรณ์, รองรับ Unicode ทั้งหมด, การจัดการช่วงอย่างมีประสิทธิภาพ เป็นต้น
-
เอกสารอ้างอิง
- ได้แรงบันดาลใจจากบทความของ Russ Cox และงานวิจัยของ Cyril Allauzen กับ Mehryar Mohri
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
เจ๋งมาก คาดหวังการพัฒนาของโปรเจ็กต์นี้
cat:dogถูกตีความเป็นca(t:d)ogแทนที่จะเป็น(cat):(dog)แนะนำ XFST (Xerox Finite-State Transducer)
แนะนำ Rosie Pattern Language เป็นทางเลือกแทน regular expression มาตรฐาน
แชร์ประสบการณ์การเขียนงานวิจัยเกี่ยวกับ finite-state transducer เมื่อปี 1997
:จับกลุ่มแน่นกว่าabสำหรับไวยากรณ์นั้นถูกต้องหรือไม่รู้สึกว่ายังไม่เพียงพอเมื่อใช้ทำการแทนที่แบบมีโครงสร้าง
ตั้งข้อสงสัยกับคำกล่าวที่ว่า regular expression ไม่เป็นธรรมชาติสำหรับการแก้ไขข้อความ
ชมว่าโค้ด C สะอาดมาก
theory.pdfใน README เสียและควรแก้ไขตั้งข้อสงสัยกับคำแนะนำที่ว่าไม่ควรใช้
*หรือ+รู้สึกว่าตัวอย่างแรกแปลก ๆ
echo 'cat' | trre 'c:da:ot:g'ดูผิดปกติสงสัยว่าตัวอย่างต่าง ๆ เป็นผลลัพธ์จริงจากโปรแกรมหรือไม่
echo 'cat dog' | trre 'c:bat|d:hog'ดูผิดปกติ