Regex ที่ชอบการแข่งขันที่สั้นกว่าในการแข่งขัน? (สิ่งนี้เกี่ยวข้องมากกว่าการไม่โลภ)


9

ฉันพยายามสร้างสคริปต์เพื่อทำการค้นหาแบบฟัซซีภายในบัฟเฟอร์ แนวคิดหลักคือการใช้การป้อนข้อมูลบางส่วนและแทรก.\{-}ระหว่างคู่ของตัวละครทุกเช่นกลายเป็นfoof.\{-}o.\{-}o

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

public void put()

การค้นหาคลุมเครือput(เช่นนั้นp.\{-}u.\{-}t) จะจับคู่สตริงทั้งหมดpublic void putแต่การย่อตัวputภายในนั้นจะมีประโยชน์มากกว่า

ผู้ดำเนินการที่ไม่ใช่โลภเก่งในการค้นหาการแข่งขันที่สิ้นสุดก่อนหน้านี้ แต่ฉันต้องการบางสิ่งที่สามารถทำได้ในเวลาเดียวกันต้องการการแข่งขันที่เริ่มต้นในภายหลัง ตามหลักการแล้วมันไม่ควรโลภทั้งสองทิศทาง เป็นไปได้ไหม


ดูเพิ่มเติมที่: stackoverflow.com/q/15191291 (ไม่มีคำตอบสำหรับคำถามของคุณ แต่น่าเสียดายที่)
Doorknob

1
@ Doorknob ไม่มีคำตอบ แต่จะเพิ่มจุดดี: Regex ไม่ได้เริ่มค้นหาจากกลางสตริง ฉันอาจต้องเกี่ยวข้องกับ VimScript เพื่อให้งานเสร็จ ฉันสำรวจความคิดของการย้อนกลับการแข่งขัน (ยาว) และค้นหาในรูปแบบที่ตรงกันข้าม
tommcdo

2
Tim Pope ปล่อยเสียงเฮย์สแต็คในวันนี้ มันฟังดูคล้ายกับสิ่งที่คุณต้องการ บางทีคุณอาจได้แรงบันดาลใจจากมันหรืออาจจะใช้มันก็ได้
tokoyami

1
ฉันต้องการให้การแข่งขันเริ่มต้นช้าที่สุดและจบเร็วที่สุดเท่าที่จะเป็นไปได้ในขณะที่ยังคงพอใจกับรูปแบบ
tommcdo

1
คุณควรดูอัลกอริธึมการจับคู่สตริงโดยประมาณที่เรียกว่าเป็นเครื่องมือที่เหมาะสมกว่าในการใช้เครื่องมือค้นหาฟัซซีมากกว่า regexps
toro2k

คำตอบ:


2

มีตัวอย่างไม่เพียงพอ แต่ฉันคิดว่านี่เป็นสิ่งที่คุณต้องการ

.*\zsp.\{-}u.\{-}t

จะตรงกับในตัวอย่างของคุณแทนput public void putโดยพื้นฐานแล้ว.*บังคับให้เอนจิ้น regex เริ่มค้นหาสตริงย้อนหลังเนื่องจากการ.*ใช้สตริงทั้งหมดก่อนแล้วย้อนรอยเพื่อค้นหาคู่ที่ตรงกันล่าสุดของp.\{-}u.\{-}t


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