RegEx: การจับคู่ที่เล็กที่สุดหรือการจับคู่ที่ไม่เหมาะสม


คำตอบ:


195

สำหรับนิพจน์ทั่วไปเช่น.*หรือ.+ให้ต่อท้ายเครื่องหมายคำถาม ( .*?หรือ.+?) เพื่อจับคู่อักขระให้น้อยที่สุด การเลือกที่ตรงกับส่วนแต่ไม่มีการจับคู่ถ้าไม่จำเป็นจริงบางสิ่งบางอย่างเช่นการใช้งาน(?:blah)? (?:blah){0,1}?สำหรับการจับคู่ซ้ำ (โดยใช้{n,}หรือ{n,m}ไวยากรณ์) ต่อท้ายเครื่องหมายคำถามเพื่อพยายามจับคู่ให้น้อยที่สุด (เช่น{3,}?หรือ{5,7}? )

เอกสารเกี่ยวกับตัวระบุจำนวนนิพจน์ทั่วไปอาจเป็นประโยชน์เช่นกัน


7
ฉันไม่รู้ว่าฉันเป็นคนเดียวที่มีความเข้าใจผิดนี้หรือไม่ แต่สิ่งสำคัญที่ควรทราบ: แม้ว่าตัวดำเนินการที่ไม่โลภจะจับคู่อักขระให้น้อยที่สุดเท่าที่จะเป็นไปได้ แต่ก็อาจไม่ตรงกับที่ต้องการ สำหรับ. "อักขระน้อยที่สุดเท่าที่จะทำได้" ไม่เท่ากับ "การจับคู่ที่สั้นที่สุดที่เป็นไปได้" เกี่ยวกับมาตรฐาน RegEx ดูคำตอบด้านล่างความคิดเห็นของฉัน: ด้วยabcabkและa.+?kRegEx จะจับคู่สตริงทั้งหมด
finefoot

Line2 "แต่ไม่มีการจับคู่เว้นแต่จำเป็นจริงๆ": หมายความว่าอย่างไร
ฝนตก


45

ตัวดำเนินการที่ไม่โลภไม่ได้หมายถึงการจับคู่ที่สั้นที่สุด:

abcabk

a.+?k จะจับคู่สตริงทั้งหมด (ในตัวอย่างนี้) แทนที่จะเป็นเพียงสามสัญลักษณ์สุดท้าย

ฉันต้องการหาคู่ที่เล็กที่สุดที่เป็นไปได้แทน

นั่นคือการแข่งขันที่เป็นไปได้สุดท้ายสำหรับ ' a' kยังคงอนุญาตให้มีการแข่งขันทั้งหมด

ฉันเดาว่าวิธีเดียวที่จะทำได้คือการใช้นิพจน์เช่น:

a[^a]+?k


2
หรือค้นหาในลำดับย้อนกลับเริ่มต้นที่จุดสิ้นสุดเมื่อการจับคู่ซ้อนกัน: "(ab (abk) bk)"
LBogaardt

7
@LBogaardt หนึ่งจะค้นหาในลำดับย้อนกลับได้อย่างไร? อย่าเข้าใจ
azerafati

2
@LBogaardt ยังคงเป็นคำถามที่เปิดอยู่: การค้นหาจะเรียงลำดับย้อนกลับได้อย่างไร? cabช่วยบอกฉันต้องการที่จะได้รับ หากอินพุตของฉันคือcaaacabและฉันค้นหาa.*?bมันจะส่งคืนสตริงเต็มแทนการจับคู่แบบสั้นภายใน ฉันจะค้นหาย้อนหลังได้bอย่างไรจาก?
C4d

3
ย้อนกลับสตริงจากนั้นใช้ regex
Jonathan Allen

3
นี่เป็นประโยชน์อย่างยิ่ง สำหรับคนอย่างฉันที่พยายามทำความเข้าใจว่าเกิดอะไรขึ้นที่นี่รูปแบบทั่วไปคือSTART[^START]*?END(โดยที่ START และ END คือ regex ของอักขระเริ่มต้นและสิ้นสุดของคุณ) โดยพื้นฐานแล้วหมายถึง "จับคู่อะไรก็ได้ตั้งแต่ START ถึง END โดยที่อักขระที่อยู่ระหว่างนั้นจะไม่รวม START อีกครั้ง"
derekantrican
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.