Apa arti tanda 'g' dalam ekspresi reguler?

110

Apa arti gbendera dalam ekspresi reguler?

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

intelis
sumber

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.

sachleen
sumber
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' ]
Luke W.
sumber
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.

davepmiller
sumber
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.

Neil
sumber
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);

cchamberlain.dll
sumber
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

matiska
sumber
3

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

Neonguardian
sumber
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,'');
Deepak
sumber
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"].
Nagibaba
sumber
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