Regex บวกกับความแตกต่างของดาว?


คำตอบ:


150

พวกเขาเรียกว่าตัวระบุปริมาณ

* 0 หรือมากกว่าของนิพจน์ก่อนหน้า

+ 1 หรือมากกว่าของนิพจน์ก่อนหน้า

ตามค่าเริ่มต้นตัวระบุปริมาณเป็นแบบโลภซึ่งหมายความว่าจะจับคู่อักขระให้มากที่สุด

?หลังจากปริมาณมีการเปลี่ยนแปลงพฤติกรรมที่จะทำให้ปริมาณนี้ "ungreedy" หมายความว่ามันจะตรงกับน้อยที่สุดเท่าที่เป็นไปได้

ตัวอย่างโลภ / ไม่เคารพ

ตัวอย่างเช่นในสตริง " abab "

a.*b จะตรงกับ "abab" (preg_match_all จะส่งคืนการแข่งขันหนึ่งรายการคือ "abab")

ในขณะที่a.*?bจะจับคู่เฉพาะ "ab" เริ่มต้นเท่านั้น (preg_match_all จะส่งกลับการแข่งขันสองรายการ "ab")

คุณสามารถทดสอบ regexes ออนไลน์ได้เช่นบน Regexr ดูตัวอย่างโลภที่นี่


2
"ขี้เกียจ" เป็นคำที่ใช้บ่อยกว่าสำหรับ "ไม่เคารพ"
Walter Tross

ตัวอย่างไม่ถูกต้อง ทั้งสอง(.+?)และการ(.*?)ทำงานแตกต่างกันในตำแหน่งต่าง ๆ ของการแสดงออกปกติซึ่งเป็นa(.+?), (.+?)b, a(.+?)b, a(.*?), ,(.*?)b a(.*?)b
Louis55

ทำไมไม่ให้ a. * b คืน "ab"? ไม่ใช่ว่า "คำที่มีระหว่าง a และ b, 0 หรือมากกว่าอักขระ" ดังนั้น ab จึงมีอักขระเป็นศูนย์ระหว่างและสามารถจับคู่ เหตุใดจึงไม่ถูกต้อง
Hello World

@HelloWorld สิ่งนี้เกี่ยวข้องกับความโลภที่ฉันอธิบายไว้ข้างต้น .*จะจับคู่ให้มากที่สุด หากคุณต้องการหยุดให้เร็วที่สุดคุณต้องทำให้ไม่พอใจ.*?
stema

22

ตัวแรก ( +) คืออักขระหนึ่งตัวขึ้นไป ที่สอง ( *) เป็นศูนย์หรือมากกว่าตัวอักษร ทั้งคู่ไม่โลภ ( ?) และจับคู่อะไรก็ได้ ( .)


1
ขึ้นอยู่กับว่ามีการตั้งค่าตัวปรับแต่งหรือไม่
Quentin

8

+ตรงกับหนึ่งหรือมากกว่าหนึ่งกรณีของรูปแบบก่อนหน้านี้ *ตรงกับศูนย์หรือมากกว่ากรณีของรูปแบบก่อนหน้านี้

โดยพื้นฐานแล้วถ้าคุณใช้+ต้องมีอย่างน้อยหนึ่งอินสแตนซ์ของรูปแบบหากคุณใช้*มันจะยังคงตรงกันหากไม่มีอินสแตนซ์ของมัน


8

+ จับคู่อักขระอย่างน้อยหนึ่งตัว

* จับคู่จำนวนอักขระใด ๆ (รวม 0) ของอักขระ

?บ่งชี้การแสดงออกขี้เกียจจึงจะตรงกับตัวละครน้อยที่สุด


8

พิจารณาด้านล่างคือสตริงที่จะจับคู่

ab

รูปแบบ(ab.*)จะส่งคืนการจับคู่สำหรับกลุ่มการจับภาพโดยมีผลลัพธ์เป็นab

ในขณะที่รูปแบบ(ab.+)จะไม่ตรงกันและไม่ส่งคืนอะไรเลย

แต่ถ้าคุณเปลี่ยนสตริงเป็นต่อไปนี้จะกลับมาabaเป็นรูปแบบ(ab.+)

aba

ฉันคิดว่านี่เป็นคำตอบที่ดีกว่าโดยเฉพาะสำหรับคำถาม + vs *
Terrence

6

+มีค่าน้อยที่สุด*สามารถเป็นศูนย์ได้เช่นกัน


"+ is minimal one"ประโยคนี้หมายความว่าอย่างไร?
เดช

5

ใน RegEx {i,f}หมายถึง "ระหว่างiถึงfคู่" ลองดูตัวอย่างต่อไปนี้:

  • {3,7} หมายถึงระหว่าง 3 ถึง 7 แมตช์
  • {,10} หมายถึงการแข่งขันสูงสุด 10 รายการโดยไม่มีขีด จำกัด ล่าง (เช่นขีด จำกัด ต่ำคือ 0)
  • {3,} หมายถึงการแข่งขันอย่างน้อย 3 รายการโดยไม่มีขีด จำกัด บน (เช่นขีด จำกัด สูงคืออินฟินิตี้)
  • {,} หมายถึงไม่มีขีด จำกัด บนหรือขีด จำกัด ล่างสำหรับจำนวนการแข่งขัน (เช่นขีด จำกัด ล่างคือ 0 และขีด จำกัด บนคืออินฟินิตี้)
  • {5} หมายความว่า 4

ภาษาที่ดีส่วนใหญ่มีตัวย่อ RegEx ก็เช่นกัน:

  • + เป็นชวเลขสำหรับ {1,}
  • * เป็นชวเลขสำหรับ {,}
  • ? เป็นชวเลขสำหรับ {,1}

ซึ่งหมายความว่า+ต้องมีการแข่งขันอย่างน้อย 1 ครั้งในขณะที่*ยอมรับการแข่งขันจำนวนเท่าใดก็ได้หรือไม่มีการแข่งขันเลยและ?ยอมรับการแข่งขันไม่เกิน 1 รายการหรือเป็นศูนย์

เครดิต: Codecademy.com


4

ดาวคล้ายกับเครื่องหมายบวกมากความแตกต่างเพียงอย่างเดียวคือในขณะที่เครื่องหมายบวกตรงกับอักขระ / กลุ่มที่อยู่ก่อนหน้า 1 ตัวขึ้นไปดาวจะตรงกับ 0 หรือมากกว่า


2

ฉันคิดว่าคำตอบก่อนหน้านี้ไม่สามารถเน้นตัวอย่างง่ายๆ:

ตัวอย่างเช่นเรามีอาร์เรย์:

numbers = [5, 15]

นิพจน์ regex ต่อไปนี้^[0-9]+ตรงกัน: 15เท่านั้น อย่างไรก็ตาม^[0-9]*ตรงกับทั้งสอง5 and 15อย่าง ความแตกต่างคือตัว+ดำเนินการต้องการนิพจน์ regex ที่ซ้ำกันอย่างน้อยหนึ่งรายการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.