ฉันจะบอก 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.+?k
RegEx จะจับคู่สตริงทั้งหมด