ความหมายของแฟล็ก 'g' ในนิพจน์ทั่วไปคืออะไร?


คำตอบ:


130

gมีไว้สำหรับการค้นหาทั่วโลก ความหมายจะตรงกับเหตุการณ์ทั้งหมด โดยปกติคุณจะเห็นiว่าหมายถึงละเว้นกรณี

อ้างอิง: global - JavaScript | นพ

แฟล็ก "g" ระบุว่าควรทดสอบนิพจน์ทั่วไปกับการจับคู่ที่เป็นไปได้ทั้งหมดในสตริง

หากไม่มีการgตั้งค่าสถานะจะเป็นการทดสอบครั้งแรกเท่านั้น


1
ดังนั้นแฟล็ก / g จึงไม่เกี่ยวข้องเมื่อใช้ฟังก์ชั่น. test เนื่องจากพบเฉพาะการจับคู่ครั้งแรกใช่ไหม
xr280xr

10
@ xr280xr ไม่เกี่ยวเหมือนต่อต้านมากกว่า มันจะทำลายสิ่งต่าง ๆ หากคุณใช้ RegExp ซ้ำ var r = /a/g; console.log(r.test('a'), r.test('a')); // true false
Janosch



10

g คือค่าสถานะการค้นหาทั่วโลก

แฟล็กการค้นหาส่วนกลางทำให้ RegExp ค้นหารูปแบบตลอดทั้งสตริงโดยสร้างอาร์เรย์ของเหตุการณ์ทั้งหมดที่สามารถค้นหาได้ตรงกับรูปแบบที่กำหนด

ดังนั้นความแตกต่างระหว่าง /.+/gและ/.+/ คือgเวอร์ชันจะพบทุกเหตุการณ์แทนที่จะเป็นเพียงครั้งแรก


9

ไม่มีความแตกต่างระหว่าง/.+/gและ/.+/เนื่องจากทั้งคู่จะจับคู่สตริงทั้งหมดเพียงครั้งเดียวเท่านั้น สิ่งนี้gจะสร้างความแตกต่างหากนิพจน์ทั่วไปสามารถจับคู่ได้มากกว่าหนึ่งครั้งหรือมีกลุ่มซึ่งในกรณีนี้.match()จะส่งคืนอาร์เรย์ของการจับคู่แทนที่จะเป็นอาร์เรย์ของกลุ่ม


8

ดังที่ @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);


6

นอกเหนือจากความหมายของgธงที่กล่าวไปแล้วยังมีอิทธิพลต่อregexp.lastIndexทรัพย์สิน:

lastIndex เป็นคุณสมบัติจำนวนเต็มอ่าน / เขียนของอินสแตนซ์นิพจน์ทั่วไปที่ระบุดัชนีที่จะเริ่มการจับคู่ครั้งถัดไป (... ) คุณสมบัตินี้ถูกตั้งค่าก็ต่อเมื่ออินสแตนซ์นิพจน์ทั่วไปใช้แฟล็ก "g" เพื่อระบุการค้นหาส่วนกลาง

ข้อมูลอ้างอิง: Mozilla Developer Network


3

G ในนิพจน์ทั่วไปเป็นการกำหนดการค้นหาส่วนกลางซึ่งหมายความว่าจะค้นหาอินสแตนซ์ทั้งหมดในบรรทัดทั้งหมด


1

จะยกตัวอย่างตามสตริง หากเราต้องการลบเหตุการณ์ทั้งหมดออกจากสตริง บอกว่าเราต้องการลบการเกิด "o" กับ "" ทั้งหมดออกจาก "hello world" หรือไม่

"hello world".replace(/o/g,'');

0
  1. g -> ส่งคืนการแข่งขันทั้งหมด
  2. without g -> ส่งคืนคู่แรก

ตัวอย่าง:

  1. '1 2 1 5 6 7'.match(/\d+/)["1", index: 0, input: "1 2 1 5 6 7", groups: undefined]ผลตอบแทน "1"ในขณะที่คุณเห็นว่าเราสามารถใช้การแข่งขันครั้งแรก
  2. '1 2 1 5 6 7'.match(/\d+/g)["1", "2", "1", "5", "6", "7"]ส่งกลับอาร์เรย์ของการแข่งขันทั้งหมด

1
โปรดอธิบายเพิ่มเติมว่า "การแข่งขันทั้งหมด" กับ "นัดแรก" แตกต่างกันอย่างไร
Nico Haase

ฉันอธิบายเพิ่มเติม ขอบคุณสำหรับคำแนะนำ
Nagibaba

@NicoHaase คุณช่วยลบอัตราติดลบของคุณได้ไหม? ฉันพยายามอธิบายมากขึ้น
Nagibaba

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