ทำไม Vim regex ไม่อนุญาตการจับมากกว่า 9 กลุ่ม


16

จาก:h E65นั้นเราจะเห็นว่า Vim ไม่อนุญาตให้มีกลุ่มการดักจับมากกว่า 9 กลุ่มในคำสั่งการแทนที่

ตัวอย่างเช่นคำสั่งต่อไปนี้จะทำงาน:

s/\v(a)(b)(c)(d)(e)(f)(g)(h)(i)/\9\8\7\6\5\4\3\2\1

แต่อันนี้ที่มีกลุ่มการดักจับมากกว่าหนึ่งกลุ่มจะล้มเหลว:

s/\v(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)/\10\9\8\7\6\5\4\3\2\1

คำถามของฉันไม่เกี่ยวกับสาเหตุที่มันล้มเหลว (มันเป็นขีด จำกัด ของ Vim) แต่ทำไม Vim ถึงมีขีด จำกัด นี้อยู่ด้วย?

นอกจากนี้ฉันทราบว่า regex ชีวิตจริงที่มีกลุ่มดักจับมากกว่า 9 กลุ่มน่าจะเป็นเรื่องที่น่าประหลาดใจที่จะอ่านและดูแล แต่ฉันก็ยังสงสัยอยู่


2
อาจไม่เกี่ยวข้องกับ Vim เท่านั้น: stackoverflow.com/a/10993346/2558252
nobe4

1
@ nobe4: น่าสนใจ! ดังนั้นบางทีคนสร้างเครื่องมือเหล่านี้คิดว่ามากกว่า 9 กลุ่มมีความไร้ประโยชน์ ...
statox

ฉันคิดว่าข้อ จำกัด นี้มาจาก vi ซึ่งรับการ จำกัด จาก ed / sed หลายปีที่ผ่านมาฉันได้ทำการปะเพื่อรองรับได้ถึง 99 กลุ่ม แต่ก็ไม่รวม
Christian Brabandt

1
@ChristianBrabandt การเพิ่มที่มีประโยชน์มากกว่านี้คือการใช้แฟล็กตัวเลขในsed: s/.../.../3จะแทนที่เฉพาะการเกิดขึ้นครั้งที่ 3 ของรูปแบบ นี่อาจเป็นฟีเจอร์ที่ฉันคิดถึงมากที่สุดในกลุ่ม
Sato Katsura

2
การสนับสนุนการบันทึกชื่อจะเป็นอีกวิธีหนึ่งในการบรรเทาปัญหานี้ เป็นที่กล่าวว่ามากที่สุดเท่าที่ผมเคยเห็นที่ใดก็ได้ที่อยู่ใกล้กับ 9 กลุ่มจับได้เมื่อคนไม่ได้รู้ว่าพวกเขาสามารถใช้กลุ่มที่ไม่ใช่การจับ \%()-
jamessan

คำตอบ:


24

เหตุผลที่ชัดเจนคือกลุ่มที่มีสองคนหรือมากกว่าตัวเลขไม่ชัดเจนควร\12จะนำมาเป็นกลุ่ม 12 หรือเป็นกลุ่มที่ 1 ตามด้วยสตริง2?

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


นี่เป็นโอกาสที่ดีคุณมีการอ้างอิง / อ่านเกี่ยวกับเรื่องนี้หรือไม่?
nobe4

2
@ nobe4 สำหรับส่วนที่คลุมเครือ: ไม่ แต่ IMO มันชัดเจน สำหรับส่วนที่มีประสิทธิภาพคุณจะต้องอ่านเกี่ยวกับการใช้งานต้นของ regexps มันเป็นปัญหาที่รู้จักกันดีในเวลานั้น ฉันไม่มีการอ้างอิงที่แน่นอน แต่พวกเขาไม่ควรหายาก
Sato Katsura

แน่นอนว่าฟังดูมีเหตุผลทั้งหมด
statox

4
ใช่มันเกือบจะแน่นอนว่า parser ถูกเขียนขึ้นเพื่อค้นหาตัวเลขหนึ่งตัวหลังแบ็กสแลชและไม่เคยเปลี่ยน นี่เป็นเรื่องธรรมดาพอมานานแล้ว ภาษาอื่น ๆ เกิดขึ้นด้วยวิธีการนี้ (ตัวอย่างเช่นเพียงพิจารณา\11การอ้างอิงถึงการจับกุมหากมีอย่างน้อย 11 ของพวกเขาซึ่งไม่สอดคล้องกัน แต่มักจะโอเคและสิ่งต่าง ๆ เช่น\g{11}backreferences และ${11}เพื่อทดแทน) แต่เป็นกลุ่มที่ไม่เคย แนะนำใด ๆ ของเหล่านั้น
ฮอบส์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.