Normal ifadelerde 'g' bayrağının anlamı nedir?


110

gNormal ifadelerde bayrağın anlamı nedir ?

Arasındaki fark nedir olduğu /.+/gve /.+/?

Yanıtlar:


130

gküresel arama içindir. Yani tüm oluşumlarla eşleşecek. Genellikle şunu da göreceksinizi bunun ne anlama geldiğini .

Referans: global - JavaScript | MDN

"G" bayrağı, normal ifadenin bir dizedeki tüm olası eşleşmelere karşı test edilmesi gerektiğini belirtir.

gBayrak olmazsa, sadece ilkini test eder.


1
Öyleyse / g bayrağı .test işlevi kullanılırken önemsizdir, çünkü zaten yalnızca ilk eşleşmeyi bulur, değil mi?
xr280xr

10
@ xr280xr Alakasız değil, daha çok verimsiz gibi. RegExp'i yeniden kullanırsanız işleri bozacaktır. var r = /a/g; console.log(r.test('a'), r.test('a')); // true false
Janosch


41

Açıklamak için Javascript'teki örnek:

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

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

10

g küresel arama bayrağıdır.

Genel arama bayrağı, RegExp'in dize boyunca bir kalıp aramasını sağlar ve verilen kalıpla eşleşen tüm oluşumlardan oluşan bir dizi oluşturur.

Arasındaki fark Yani /.+/gve /.+/ olmasıdır gversiyon yerine ilk her olay bulacaksınız.


9

Arasında hiçbir fark yoktur /.+/gve /.+/her ikisi de sadece bir kere bütün dize maç olacak çünkü. Bu g, normal ifadenin birden fazla eşleşebilmesi veya gruplar içermesi durumunda bir fark yaratır; bu durumda .match(), bir grup dizisi yerine bir eşleşmeler dizisi döndürür.


8

@Matiska'nın belirttiği gibi, gbayraklastIndex mülkü de .

Bunun çok önemli bir yan etkisi, aynı regex örneğini eşleşen bir dizeye karşı yeniden kullanıyorsanız, sonunda başarısız olacaktır çünkü yalnızca 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

gBayrağın daha önce bahsedilen anlamının yanı sıra , regexp.lastIndexmülkü etkiler :

LastIndex, bir sonraki eşleşmenin başlayacağı dizini belirten normal ifade örneklerinin okuma / yazma tamsayı özelliğidir. (...) Bu özellik, yalnızca normal ifade örneği genel bir aramayı belirtmek için "g" bayrağını kullanıyorsa ayarlanır.

Referans: Mozilla Geliştirici Ağı


3

Normal ifadelerde G, bir genel aramayı tanımlar, yani tüm satırlardaki tüm örnekleri arayacağı anlamına gelir.


1

Dizeye göre örnek verecektir. Bir dizedeki tüm oluşumları kaldırmak istiyorsak. Diyelim ki, "merhaba dünya" dan "o" ile "" nin tüm geçtiği yerleri kaldırmak istiyorsak

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

0
  1. g -> tüm maçları döndürür
  2. without g -> ilk eşleşmeyi döndürür

misal:

  1. '1 2 1 5 6 7'.match(/\d+/)döner ["1", index: 0, input: "1 2 1 5 6 7", groups: undefined]. Gördüğünüz gibi sadece ilk maçı yapabiliriz "1".
  2. '1 2 1 5 6 7'.match(/\d+/g)tüm eşleşmelerin bir dizisini döndürür ["1", "2", "1", "5", "6", "7"].

1
Lütfen bunu daha fazla açıklayın - "tüm eşleşmeler" ve "ilk eşleşme" arasındaki fark nedir?
Nico Haase

Daha fazlasını anlattım. Rehberliğiniz için teşekkürler
Nagibaba

@NicoHaase lütfen negatif oranınızı kaldırır mısınız? Daha açıklayıcı olmaya çalıştım.
Nagibaba

Yanlış anlaşıldığım için özür dilerim :)
Nagibaba
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.