การจำกัดความละโมบใน Regular Expressions ใน JavaScript
Regular Expressions โดยค่าเริ่มต้นนั้น ละโมบ นั่นหมายความว่าพวกมันจะจับตัวอักษรให้ได้มากที่สุด เท่าที่เป็นไปได้ ลองมาดูตัวอย่างกัน สมมติว่าเรามีสตริงแบบนี้:
let str = 'aeeex zzz x kkk';
สมมติว่าในสตริงนี้เราต้องการหาสับสตริง
'aeeex' โดยใช้แพตเทิร์นต่อไปนี้: ตัวอักษร
'a' ตามด้วยอักขระใดๆหนึ่งตัวหรือมากกว่า
จากนั้นตามด้วยตัวอักษร 'x'
let res = str.replace(/a.+x/g, '!');
เราคาดหวังว่าผลลัพธ์ในตัวแปรนั้น
จะเป็นสตริง '! zzz x kkk' อย่างไรก็ตาม
มันไม่เป็นเช่นนั้น - ค่าที่ได้ในตัวแปรคือสตริง
'! kkk'
ทั้งหมดเป็นเพราะว่า regex ของเราค้นหาทุก
ตัวอักษรจากตัวอักษร 'a' ไปถึงตัวอักษร 'x'
แต่ในสตริงของเรามีตัวอักษร 'x' อยู่สองตัว! เนื่องจาก
ความละโมบ ทำให้ regex ค้นหาไปจนถึง
ตัว x ตัวสุดท้าย ทำให้จับส่วนที่
ไม่ตรงกับที่เราคาดหวังไว้
แน่นอนว่า พฤติกรรมเช่นนี้มักเป็นสิ่งที่เราต้องการ แต่ในกรณีนี้โดยเฉพาะ เราอยากยกเลิกความละโมบ และบอก regex ให้ค้นหาไปจนถึงตัว x ตัวแรกเท่านั้น
เพื่อจำกัดความละโมบ ต้องเติมเครื่องหมายคำถาม หลังโอเปอเรเตอร์การทำซ้ำ:
let res = str.replace(/a.+?x/g, '!');
สามารถจำกัดความละโมบได้กับโอเปอเรเตอร์การทำซ้ำทุกตัว
ทั้ง *, ?, และ {}
- แบบนี้: *?, ?? และ {}?
กำหนดสตริง:
let str = 'aba accca azzza wwwwa';
เขียน Regular Expression ที่จะหาสตริงทั้งหมด
ที่เริ่มต้นและลงท้ายด้วยตัวอักษร 'a'
และแทนที่แต่ละสตริงนั้นด้วย '!' ระหว่าง
ตัวอักษร 'a' สามารถมีอักขระใดๆก็ได้ (ยกเว้น
'a')