อะไรคือความแตกต่างระหว่าง:
(.+?)
และ
(.*?)
เมื่อฉันใช้ใน php preg_match
regex ของฉัน?
อะไรคือความแตกต่างระหว่าง:
(.+?)
และ
(.*?)
เมื่อฉันใช้ใน php preg_match
regex ของฉัน?
คำตอบ:
พวกเขาเรียกว่าตัวระบุปริมาณ
*
0 หรือมากกว่าของนิพจน์ก่อนหน้า
+
1 หรือมากกว่าของนิพจน์ก่อนหน้า
ตามค่าเริ่มต้นตัวระบุปริมาณเป็นแบบโลภซึ่งหมายความว่าจะจับคู่อักขระให้มากที่สุด
?
หลังจากปริมาณมีการเปลี่ยนแปลงพฤติกรรมที่จะทำให้ปริมาณนี้ "ungreedy" หมายความว่ามันจะตรงกับน้อยที่สุดเท่าที่เป็นไปได้
ตัวอย่างโลภ / ไม่เคารพ
ตัวอย่างเช่นในสตริง " abab "
a.*b
จะตรงกับ "abab" (preg_match_all จะส่งคืนการแข่งขันหนึ่งรายการคือ "abab")
ในขณะที่a.*?b
จะจับคู่เฉพาะ "ab" เริ่มต้นเท่านั้น (preg_match_all จะส่งกลับการแข่งขันสองรายการ "ab")
คุณสามารถทดสอบ regexes ออนไลน์ได้เช่นบน Regexr ดูตัวอย่างโลภที่นี่
(.+?)
และการ(.*?)
ทำงานแตกต่างกันในตำแหน่งต่าง ๆ ของการแสดงออกปกติซึ่งเป็นa(.+?)
, (.+?)b
, a(.+?)b
, a(.*?)
, ,(.*?)b
a(.*?)b
.*
จะจับคู่ให้มากที่สุด หากคุณต้องการหยุดให้เร็วที่สุดคุณต้องทำให้ไม่พอใจ.*?
ตัวแรก ( +
) คืออักขระหนึ่งตัวขึ้นไป ที่สอง ( *
) เป็นศูนย์หรือมากกว่าตัวอักษร ทั้งคู่ไม่โลภ ( ?
) และจับคู่อะไรก็ได้ ( .
)
+
ตรงกับหนึ่งหรือมากกว่าหนึ่งกรณีของรูปแบบก่อนหน้านี้ *
ตรงกับศูนย์หรือมากกว่ากรณีของรูปแบบก่อนหน้านี้
โดยพื้นฐานแล้วถ้าคุณใช้+
ต้องมีอย่างน้อยหนึ่งอินสแตนซ์ของรูปแบบหากคุณใช้*
มันจะยังคงตรงกันหากไม่มีอินสแตนซ์ของมัน
+
จับคู่อักขระอย่างน้อยหนึ่งตัว
*
จับคู่จำนวนอักขระใด ๆ (รวม 0) ของอักขระ
?
บ่งชี้การแสดงออกขี้เกียจจึงจะตรงกับตัวละครน้อยที่สุด
พิจารณาด้านล่างคือสตริงที่จะจับคู่
ab
รูปแบบ(ab.*)
จะส่งคืนการจับคู่สำหรับกลุ่มการจับภาพโดยมีผลลัพธ์เป็นab
ในขณะที่รูปแบบ(ab.+)
จะไม่ตรงกันและไม่ส่งคืนอะไรเลย
แต่ถ้าคุณเปลี่ยนสตริงเป็นต่อไปนี้จะกลับมาaba
เป็นรูปแบบ(ab.+)
aba
ใน RegEx {i,f}
หมายถึง "ระหว่างi
ถึงf
คู่" ลองดูตัวอย่างต่อไปนี้:
{3,7}
หมายถึงระหว่าง 3 ถึง 7 แมตช์ {,10}
หมายถึงการแข่งขันสูงสุด 10 รายการโดยไม่มีขีด จำกัด ล่าง (เช่นขีด จำกัด ต่ำคือ 0){3,}
หมายถึงการแข่งขันอย่างน้อย 3 รายการโดยไม่มีขีด จำกัด บน (เช่นขีด จำกัด สูงคืออินฟินิตี้){,}
หมายถึงไม่มีขีด จำกัด บนหรือขีด จำกัด ล่างสำหรับจำนวนการแข่งขัน (เช่นขีด จำกัด ล่างคือ 0 และขีด จำกัด บนคืออินฟินิตี้){5}
หมายความว่า 4 ภาษาที่ดีส่วนใหญ่มีตัวย่อ RegEx ก็เช่นกัน:
+
เป็นชวเลขสำหรับ {1,}
*
เป็นชวเลขสำหรับ {,}
?
เป็นชวเลขสำหรับ {,1}
ซึ่งหมายความว่า+
ต้องมีการแข่งขันอย่างน้อย 1 ครั้งในขณะที่*
ยอมรับการแข่งขันจำนวนเท่าใดก็ได้หรือไม่มีการแข่งขันเลยและ?
ยอมรับการแข่งขันไม่เกิน 1 รายการหรือเป็นศูนย์
เครดิต: Codecademy.com
ดาวคล้ายกับเครื่องหมายบวกมากความแตกต่างเพียงอย่างเดียวคือในขณะที่เครื่องหมายบวกตรงกับอักขระ / กลุ่มที่อยู่ก่อนหน้า 1 ตัวขึ้นไปดาวจะตรงกับ 0 หรือมากกว่า
ฉันคิดว่าคำตอบก่อนหน้านี้ไม่สามารถเน้นตัวอย่างง่ายๆ:
ตัวอย่างเช่นเรามีอาร์เรย์:
numbers = [5, 15]
นิพจน์ regex ต่อไปนี้^[0-9]+
ตรงกัน: 15
เท่านั้น อย่างไรก็ตาม^[0-9]*
ตรงกับทั้งสอง5 and 15
อย่าง ความแตกต่างคือตัว+
ดำเนินการต้องการนิพจน์ regex ที่ซ้ำกันอย่างน้อยหนึ่งรายการ