Apa arti tanda 'g' dalam ekspresi reguler?


110

Apa arti gbendera dalam ekspresi reguler?

Apa perbedaan antara /.+/gdan /.+/?

Jawaban:


130

gadalah untuk pencarian global. Artinya itu akan cocok dengan semua kejadian. Anda biasanya juga akan melihat iyang artinya mengabaikan kasus.

Referensi: global - JavaScript | MDN

Bendera "g" menunjukkan bahwa ekspresi reguler harus diuji terhadap semua kemungkinan kecocokan dalam sebuah string.

Tanpa gbendera, itu hanya akan menguji yang pertama.


1
Jadi tanda / g tidak relevan saat menggunakan fungsi .test, karena ia hanya menemukan kecocokan pertama, bukan?
xr280xr

10
@ xr280xr Bukan tidak relevan, lebih seperti kontraproduktif. Ini akan merusak banyak hal jika Anda menggunakan kembali RegExp. var r = /a/g; console.log(r.test('a'), r.test('a')); // true false
Janosch


41

Contoh dalam Javascript untuk menjelaskan:

> 'aaa'.match(/a/g)
[ 'a', 'a', 'a' ]

> 'aaa'.match(/a/)
[ 'a', index: 0, input: 'aaa' ]

10

g adalah bendera pencarian global.

Bendera pencarian global membuat RegExp mencari pola di seluruh string, membuat larik dari semua kejadian yang dapat ditemukan cocok dengan pola yang diberikan.

Jadi perbedaan antara /.+/gdan /.+/ adalah bahwa gversi tersebut akan menemukan setiap kemunculan, bukan hanya yang pertama.


9

Tidak ada perbedaan antara /.+/gdan /.+/karena keduanya hanya akan mencocokkan seluruh string sekali. The gmembuat perbedaan jika ekspresi reguler bisa cocok lebih dari sekali atau mengandung kelompok, dalam hal ini .match()akan mengembalikan array pertandingan bukan array kelompok.


8

Seperti yang ditunjukkan oleh @matiska, gflag tersebut juga menyetel lastIndexproperti.

Efek samping yang sangat penting dari hal ini adalah jika Anda menggunakan kembali instance regex yang sama terhadap string yang cocok, pada akhirnya akan gagal karena hanya mulai mencari di 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

Selain arti gbendera yang telah disebutkan , itu juga mempengaruhi regexp.lastIndexproperti:

LastIndex adalah properti bilangan bulat baca / tulis dari instance ekspresi reguler yang menentukan indeks untuk memulai pertandingan berikutnya. (...) Properti ini disetel hanya jika ekspresi reguler menggunakan tanda "g" untuk menunjukkan pencarian global.

Referensi: Jaringan Pengembang Mozilla


3

G dalam ekspresi reguler adalah definisi pencarian global, artinya akan mencari semua contoh di semua baris.


1

Akan memberi contoh berdasarkan string. Jika kita ingin menghapus semua kejadian dari sebuah string. Katakanlah jika kita ingin menghapus semua kemunculan "o" dengan "" dari "hello world"

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

0
  1. g -> mengembalikan semua pertandingan
  2. without g -> mengembalikan pertandingan pertama

contoh:

  1. '1 2 1 5 6 7'.match(/\d+/)kembali ["1", index: 0, input: "1 2 1 5 6 7", groups: undefined]. Seperti yang Anda lihat, kami hanya bisa mengambil pertandingan pertama "1".
  2. '1 2 1 5 6 7'.match(/\d+/g)mengembalikan larik semua kecocokan ["1", "2", "1", "5", "6", "7"].

1
Tolong jelaskan lebih lanjut - apa perbedaan antara "semua pertandingan" dan "pertandingan pertama"?
Nico Haase

Saya menjelaskan lebih banyak. Terima kasih atas bimbingan Anda
Nagibaba

@NicoHaase bisakah Anda menghapus nilai negatif Anda? Saya mencoba lebih menjelaskan.
Nagibaba

Maaf atas kesalahpahaman :)
Nagibaba
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.