Qual è il significato del flag "g" nelle espressioni regolari?


110

Qual è il significato del gflag nelle espressioni regolari?

Qual è la differenza tra /.+/ge /.+/?

Risposte:


130

gè per la ricerca globale. Significa che corrisponderà a tutte le occorrenze. Di solito vedrai anche iche significa ignorare maiuscole e minuscole.

Riferimento: globale - JavaScript | MDN

Il flag "g" indica che l'espressione regolare deve essere verificata rispetto a tutte le possibili corrispondenze in una stringa.

Senza la gbandiera, testerà solo il primo.


1
Quindi il flag / g è irrilevante quando si utilizza la funzione .test, perché trova comunque solo la prima corrispondenza, giusto?
xr280xr

10
@ xr280xr Non irrilevante, più controproducente. Rompere le cose se riutilizzi la RegExp. var r = /a/g; console.log(r.test('a'), r.test('a')); // true false
Janosch


41

Esempio in Javascript per spiegare:

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

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

10

g è il flag di ricerca globale.

Il flag di ricerca globale fa in modo che RegExp cerchi un pattern in tutta la stringa, creando un array di tutte le occorrenze che può trovare corrispondenti al pattern dato.

Quindi la differenza tra /.+/ge /.+/ è che la gversione troverà ogni occorrenza invece che solo la prima.


9

Non c'è differenza tra /.+/ge /.+/perché entrambi corrisponderanno sempre e solo all'intera stringa una volta. La gfa differenza se l'espressione regolare potrebbe corrispondere a più di una volta o contiene gruppi, nel qual caso .match()restituirà un array delle partite invece che una matrice dei gruppi.


8

Come ha sottolineato @matiska, anche il gflag imposta la lastIndexproprietà.

Un effetto collaterale molto importante di questo è che se stai riutilizzando la stessa istanza di regex su una stringa corrispondente, alla fine fallirà perché inizia la ricerca solo nel file 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

Oltre al già citato significato di gbandiera, influenza la regexp.lastIndexproprietà:

LastIndex è una proprietà intera di lettura / scrittura delle istanze di espressioni regolari che specifica l'indice in corrispondenza del quale avviare la corrispondenza successiva. (...) Questa proprietà è impostata solo se l'istanza dell'espressione regolare ha utilizzato il flag "g" per indicare una ricerca globale.

Riferimento: Mozilla Developer Network


3

G nelle espressioni regolari è a definisce una ricerca globale, il che significa che cercherà tutte le istanze su tutte le righe.


1

Fornirà un esempio basato sulla stringa. Se vogliamo rimuovere tutte le occorrenze da una stringa. Diciamo se vogliamo rimuovere tutte le occorrenze di "o" con "" da "ciao mondo"

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

0
  1. g -> restituisce tutte le corrispondenze
  2. without g -> restituisce la prima corrispondenza

esempio:

  1. '1 2 1 5 6 7'.match(/\d+/)ritorna ["1", index: 0, input: "1 2 1 5 6 7", groups: undefined]. Come vedi possiamo prendere solo la prima partita "1".
  2. '1 2 1 5 6 7'.match(/\d+/g)restituisce un array di tutte le corrispondenze ["1", "2", "1", "5", "6", "7"].

1
Spiegalo ulteriormente: qual è la differenza tra "tutte le corrispondenze" e "prima partita"?
Nico Haase il

Ho spiegato di più. Grazie per la vostra guida
Nagibaba

@NicoHaase puoi rimuovere il tuo tasso negativo? Ho cercato di essere più esplicativo.
Nagibaba,

Ci
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.