อะไรคือความแตกต่างระหว่าง:
(.+?)
และ
(.*?)
เมื่อฉันใช้ใน php preg_matchregex ของฉัน?
อะไรคือความแตกต่างระหว่าง:
(.+?)
และ
(.*?)
เมื่อฉันใช้ใน php preg_matchregex ของฉัน?
คำตอบ:
พวกเขาเรียกว่าตัวระบุปริมาณ
* 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 ที่ซ้ำกันอย่างน้อยหนึ่งรายการ