ฉันจะบอก RegEx (เวอร์ชัน. NET) ได้อย่างไรเพื่อให้ได้การจับคู่ที่ถูกต้องน้อยที่สุดแทนที่จะเป็นรายการที่ใหญ่ที่สุด
ฉันจะบอก RegEx (เวอร์ชัน. NET) ได้อย่างไรเพื่อให้ได้การจับคู่ที่ถูกต้องน้อยที่สุดแทนที่จะเป็นรายการที่ใหญ่ที่สุด
คำตอบ:
สำหรับนิพจน์ทั่วไปเช่น.*หรือ.+ให้ต่อท้ายเครื่องหมายคำถาม ( .*?หรือ.+?) เพื่อจับคู่อักขระให้น้อยที่สุด การเลือกที่ตรงกับส่วนแต่ไม่มีการจับคู่ถ้าไม่จำเป็นจริงบางสิ่งบางอย่างเช่นการใช้งาน(?:blah)? (?:blah){0,1}?สำหรับการจับคู่ซ้ำ (โดยใช้{n,}หรือ{n,m}ไวยากรณ์) ต่อท้ายเครื่องหมายคำถามเพื่อพยายามจับคู่ให้น้อยที่สุด (เช่น{3,}?หรือ{5,7}? )
เอกสารเกี่ยวกับตัวระบุจำนวนนิพจน์ทั่วไปอาจเป็นประโยชน์เช่นกัน
ตัวดำเนินการที่ไม่โลภ, ?. ชอบมาก:
.*?
ตัวดำเนินการที่ไม่โลภไม่ได้หมายถึงการจับคู่ที่สั้นที่สุด:
abcabk
a.+?k จะจับคู่สตริงทั้งหมด (ในตัวอย่างนี้) แทนที่จะเป็นเพียงสามสัญลักษณ์สุดท้าย
ฉันต้องการหาคู่ที่เล็กที่สุดที่เป็นไปได้แทน
นั่นคือการแข่งขันที่เป็นไปได้สุดท้ายสำหรับ ' a' kยังคงอนุญาตให้มีการแข่งขันทั้งหมด
ฉันเดาว่าวิธีเดียวที่จะทำได้คือการใช้นิพจน์เช่น:
a[^a]+?k
cabช่วยบอกฉันต้องการที่จะได้รับ หากอินพุตของฉันคือcaaacabและฉันค้นหาa.*?bมันจะส่งคืนสตริงเต็มแทนการจับคู่แบบสั้นภายใน ฉันจะค้นหาย้อนหลังได้bอย่างไรจาก?
START[^START]*?END(โดยที่ START และ END คือ regex ของอักขระเริ่มต้นและสิ้นสุดของคุณ) โดยพื้นฐานแล้วหมายถึง "จับคู่อะไรก็ได้ตั้งแต่ START ถึง END โดยที่อักขระที่อยู่ระหว่างนั้นจะไม่รวม START อีกครั้ง"
abcabkและa.+?kRegEx จะจับคู่สตริงทั้งหมด