ความหมายของg
ธงในนิพจน์ทั่วไปคืออะไร?
อะไรคือความแตกต่างระหว่าง/.+/g
และ/.+/
?
ความหมายของg
ธงในนิพจน์ทั่วไปคืออะไร?
อะไรคือความแตกต่างระหว่าง/.+/g
และ/.+/
?
คำตอบ:
g
มีไว้สำหรับการค้นหาทั่วโลก ความหมายจะตรงกับเหตุการณ์ทั้งหมด โดยปกติคุณจะเห็นi
ว่าหมายถึงละเว้นกรณี
อ้างอิง: global - JavaScript | นพ
แฟล็ก "g" ระบุว่าควรทดสอบนิพจน์ทั่วไปกับการจับคู่ที่เป็นไปได้ทั้งหมดในสตริง
หากไม่มีการg
ตั้งค่าสถานะจะเป็นการทดสอบครั้งแรกเท่านั้น
var r = /a/g; console.log(r.test('a'), r.test('a')); // true false
ตัวอย่างใน Javascript เพื่ออธิบาย:
> 'aaa'.match(/a/g)
[ 'a', 'a', 'a' ]
> 'aaa'.match(/a/)
[ 'a', index: 0, input: 'aaa' ]
g
คือค่าสถานะการค้นหาทั่วโลก
แฟล็กการค้นหาส่วนกลางทำให้ RegExp ค้นหารูปแบบตลอดทั้งสตริงโดยสร้างอาร์เรย์ของเหตุการณ์ทั้งหมดที่สามารถค้นหาได้ตรงกับรูปแบบที่กำหนด
ดังนั้นความแตกต่างระหว่าง /.+/g
และ/.+/
คือg
เวอร์ชันจะพบทุกเหตุการณ์แทนที่จะเป็นเพียงครั้งแรก
ไม่มีความแตกต่างระหว่าง/.+/g
และ/.+/
เนื่องจากทั้งคู่จะจับคู่สตริงทั้งหมดเพียงครั้งเดียวเท่านั้น สิ่งนี้g
จะสร้างความแตกต่างหากนิพจน์ทั่วไปสามารถจับคู่ได้มากกว่าหนึ่งครั้งหรือมีกลุ่มซึ่งในกรณีนี้.match()
จะส่งคืนอาร์เรย์ของการจับคู่แทนที่จะเป็นอาร์เรย์ของกลุ่ม
ดังที่ @matiska ชี้ให้เห็นg
ธงกำหนดlastIndex
คุณสมบัติเช่นกัน
ผลข้างเคียงที่สำคัญมากคือหากคุณนำอินสแตนซ์ regex เดิมกลับมาใช้กับสตริงที่ตรงกันในที่สุดก็จะล้มเหลวเนื่องจากเริ่มค้นหาที่ไฟล์lastIndex
.
// regular regex
const regex = /foo/;
// same regex with global flag
const regexG = /foo/g;
const str = " foo foo foo ";
const test = (r) => console.log(
r,
r.lastIndex,
r.test(str),
r.lastIndex
);
// Test the normal one 4 times (success)
test(regex);
test(regex);
test(regex);
test(regex);
// Test the global one 4 times
// (3 passes and a fail)
test(regexG);
test(regexG);
test(regexG);
test(regexG);
นอกเหนือจากความหมายของg
ธงที่กล่าวไปแล้วยังมีอิทธิพลต่อregexp.lastIndex
ทรัพย์สิน:
lastIndex เป็นคุณสมบัติจำนวนเต็มอ่าน / เขียนของอินสแตนซ์นิพจน์ทั่วไปที่ระบุดัชนีที่จะเริ่มการจับคู่ครั้งถัดไป (... ) คุณสมบัตินี้ถูกตั้งค่าก็ต่อเมื่ออินสแตนซ์นิพจน์ทั่วไปใช้แฟล็ก "g" เพื่อระบุการค้นหาส่วนกลาง
ข้อมูลอ้างอิง: Mozilla Developer Network
G ในนิพจน์ทั่วไปเป็นการกำหนดการค้นหาส่วนกลางซึ่งหมายความว่าจะค้นหาอินสแตนซ์ทั้งหมดในบรรทัดทั้งหมด
จะยกตัวอย่างตามสตริง หากเราต้องการลบเหตุการณ์ทั้งหมดออกจากสตริง บอกว่าเราต้องการลบการเกิด "o" กับ "" ทั้งหมดออกจาก "hello world" หรือไม่
"hello world".replace(/o/g,'');
g
->
ส่งคืนการแข่งขันทั้งหมดwithout g
->
ส่งคืนคู่แรกตัวอย่าง:
'1 2 1 5 6 7'.match(/\d+/)
["1", index: 0, input: "1 2 1 5 6 7", groups: undefined]
ผลตอบแทน "1"
ในขณะที่คุณเห็นว่าเราสามารถใช้การแข่งขันครั้งแรก'1 2 1 5 6 7'.match(/\d+/g)
["1", "2", "1", "5", "6", "7"]
ส่งกลับอาร์เรย์ของการแข่งขันทั้งหมด