ฉันเขียนบทความเกี่ยวกับการเริ่มต้นด้วยการแสดงออกปกติมาก่อน ฉันคิดว่าฉันค่อนข้างคุ้นเคยกับการแสดงออกปกติ แต่วันนี้ฉันพบกับข้อผิดพลาดอีกครั้ง อาจเป็นเพราะฉันไม่ระวังพอ วันนี้ฉันจะมุ่งเน้นไปที่การแบ่งปันการจัดกลุ่มในการแสดงออกปกติของ JavaScript หากคุณไม่เข้าใจการแสดงออกปกติของ JS เพียงพอคุณสามารถคลิกที่นี่เพื่อเรียนรู้เพิ่มเติม
การจัดกลุ่มค่อนข้างใช้กันอย่างแพร่หลายในกฎปกติ การจัดกลุ่มที่ฉันเข้าใจคือคู่ของวงเล็บ () และวงเล็บแต่ละคู่แสดงถึงกลุ่ม
การจัดกลุ่มสามารถแบ่งออกเป็น:
การจัดกลุ่มการจับภาพจะได้รับผลลัพธ์ของการจัดกลุ่มที่สอดคล้องกันในรูปแบบของเทอมที่สองและเทอมที่สามในฟังก์ชันเช่นการจับคู่ มาดูตัวอย่างก่อน
var reg =/test (/d+)/; var str = 'ใหม่ test001 test002'; console.log (str.match (reg)); // ["test001", "001", ดัชนี: 4, อินพุต: "test001 ใหม่ test002"]
ในรหัส (/d+) เป็นกลุ่ม (บางคนก็เรียกมันว่ารูปแบบย่อย) แต่พวกเขาทั้งหมดแสดงถึงความหมายเดียวกัน ในตัวอย่างด้านบน Test001 เป็นผลมาจากการจับคู่ที่แน่นอน
อย่างไรก็ตามการจับคู่ของกลุ่มคือการค้นหาอักขระที่ตรงกับรูปแบบย่อย/d+ จากผลลัพธ์การจับคู่ที่แน่นอนทั้งหมด (นั่นคือ test001) ที่นี่เห็นได้ชัดว่า 001
แต่นี่คือสิ่งที่ฉันพบในวันนี้
var reg =/test (/d)+/; var str = 'ใหม่ test001 test002'; console.log (str.match (reg)); // ["test001", "1", ดัชนี: 4, อินพุต: "ใหม่ test001 test002"]
ความแตกต่างคือ (/d+) เปลี่ยนเป็น (/d)+และผลลัพธ์การจับคู่ทั้งหมดยังคงเป็น Test001 แต่ผลลัพธ์ของการจับคู่กลุ่มแรกนั้นแตกต่างกัน
มาดูความแตกต่างกัน
(/d+) นี่เป็นสถานการณ์การจัดกลุ่มเนื่องจากโดยค่าเริ่มต้นรูปแบบการจับคู่เป็นรูปแบบโลภนั่นคือการแข่งขันมากที่สุดเท่าที่จะทำได้
ผลลัพธ์ของการจับคู่ทั้งหมด /d+ คือ 001 จากนั้นเพิ่มคู่ของวงเล็บด้านนอกซึ่งหมายถึงกลุ่มดังนั้นผลลัพธ์ของการจับคู่ในกลุ่มแรกคือ 001
ลองดูที่ (/d)+ ในตัวอย่างที่สอง นี่เป็นรูปแบบโลภ ก่อนอื่นมันจะจับคู่ 0 และ 0 จากนั้นและจะตรงกับจุดสิ้นสุดของ 1
ดูเหมือนว่าไม่มีความแตกต่างจากการแข่งขันในตัวอย่างแรก แต่การจัดกลุ่ม (/d) ที่นี่หมายถึงการจับคู่หมายเลขเดียว
จากความเข้าใจก่อนหน้านี้ของฉันผลลัพธ์ที่ว่าการแข่งขันคือ 0 ในตอนแรกคือ 0 แต่ความเข้าใจนี้ผิด เนื่องจากการแข่งขันทั้งหมดเป็นรูปแบบโลภจับคู่ให้มากที่สุด
(/d) ในกลุ่มจะจับผลลัพธ์ที่ตรงกันล่าสุด 1
ถ้ามันเป็นรูปแบบที่ไม่ได้กำหนดมันจะจับคู่น้อยที่สุดเท่าที่จะทำได้
var reg =/test (/d)+?/; var str = 'ใหม่ test001 test002'; console.log (str.match (reg)); // ["test001", "0", ดัชนี: 4, อินพุต: "ใหม่ test001 test002"]
ด้วยวิธีนี้ผลการจับคู่ (/d) คือ 0 แม้ว่าจะมีผลลัพธ์ที่สามารถจับคู่ได้ในภายหลังนี่คือการจับคู่ให้น้อยที่สุดเท่าที่จะทำได้
การจัดกลุ่มที่ไม่ได้จับ
var reg =/test (?:/d)+/; var str = 'ใหม่ test001 test002'; console.log (str.match (reg)); // ["test001", ดัชนี: 4, อินพุต: "ใหม่ test001 test002"
การจัดกลุ่มที่ไม่ได้รับการตรวจสอบหมายความว่าจำเป็นต้องใช้วงเล็บในบางสถานที่ แต่พวกเขาไม่ต้องการให้มันเป็นกลุ่มจับภาพซึ่งหมายความว่าพวกเขาไม่ต้องการให้กลุ่มนี้ได้รับฟังก์ชั่นเช่น Macth Exec
โดยปกติแล้วการเพิ่ม?: (?: รูปแบบ) ภายในวงเล็บกลายเป็นกลุ่มที่ไม่ได้รับการจับ
ด้วยวิธีนี้จะไม่มีการจับคู่เนื้อหาในผลการแข่งขันของการแข่งขันซึ่งหมายความว่ารายการที่สองหายไป
บทความนี้มุ่งเน้นไปที่การอธิบายความแตกต่างระหว่าง (/d+) และ (/d)+ซึ่งเป็นหลุมที่ฉันได้ก้าวไปในวันนี้ หากมีข้อผิดพลาดใด ๆ โปรดแก้ไขให้ถูกต้อง