โหมดโลภ:
ตัวบ่งชี้ปริมาณเริ่มต้นเป็นโหมดความโลภเว้นแต่จะระบุไว้เป็นอย่างอื่น การแสดงออกของรูปแบบโลภจะยังคงจับคู่ต่อไปจนกว่าพวกเขาจะไม่สามารถ หากคุณพบว่าผลลัพธ์ของการจับคู่นิพจน์ไม่ตรงกับสิ่งที่คาดหวังเป็นไปได้ว่าเป็นเพราะ - คุณคิดว่านิพจน์จะตรงกับตัวละครสองสามตัวแรก แต่ในความเป็นจริงมันเป็นรูปแบบโลภดังนั้นมันจะยังคงจับคู่ต่อไป
ความโลภและไม่ใช่สีเขียวรวมทั้ง? ไม่ใช่สีเขียว:
var s = '1023000'.match (/(/d+) (0*)/); s ["1023000", "1023000", ""] var s =' 1023000'.match (/^(/d+) (0*) $/); '1023000'.match (/^(/d+?) (0*) $/); s ["10", "1", "0"]
การแสดงออกปกติของ Java ใช้รูปแบบการจับคู่โลภโลภโดยค่าเริ่มต้น มันเป็นคู่ที่ยาวที่สุดของประเภทนี้ (.*) หากจำเป็นต้องมีการจับคู่ที่สั้นที่สุดมันจะถูกเปลี่ยนเป็น (.*?) นั่นคือมันเป็นรูปแบบการจับคู่ที่แทบจะไม่
การวิเคราะห์หลักการ:
หากเป็นรูปแบบการจับคู่โลภเอ็นจิ้นนิพจน์ทั่วไปจะจับคู่จนกว่าจะสิ้นสุดสตริง เมื่อการแข่งขันเป็นเท็จมันจะย้อนกลับและค้นหาตำแหน่งการจับคู่สุดท้ายเพื่อส่งคืนผลลัพธ์การจับคู่ หากเป็นรูปแบบการจับคู่ที่แทบจะไม่ได้เอ็นจิ้นปกติจะจับคู่ตัวละครในตอนท้ายของรูปแบบแล้วย้อนกลับไปพบว่าการแข่งขันเป็นเท็จจากนั้นติดตามกลับไปยังตำแหน่งที่การจับคู่ล่าสุดที่พบในทางเลือกเป็นจริง
ดูรหัส:
ตัวอย่างที่ 1:
โมฆะสาธารณะ test51 () {string str = "aaa/" bbb/"ccc/" dd/"eee"; System.out.println (str); str = str.replaceall ("/"(.*)/" ","@"); System.out.println (str); - เอาท์พุท:
aaa "bb" cc "ddd" eeaaaa@eee
ตัวอย่างที่ 2:
@Test โมฆะสาธารณะ test52 () {string str = "aaa/" bbb/"ccc/" dd/"eee"; System.out.println (str); str = str.replaceall ("/"(.*?)/" ","@"); System.out.println (str); - เอาท์พุท:
aaa "bb" cc "ddd" eeaaaa@ccc@eee