¿Cuál es el significado de la bandera 'g' en las expresiones regulares?

110

¿Cuál es el significado de la gbandera en expresiones regulares?

¿Cuál es la diferencia entre /.+/gy /.+/?

intelis
fuente

Respuestas:

130

ges para búsqueda global. Lo que significa que coincidirá con todas las ocurrencias. Por lo general, también verá iqué significa ignorar mayúsculas y minúsculas.

Referencia: global - JavaScript | MDN

La bandera "g" indica que la expresión regular debe probarse con todas las coincidencias posibles en una cadena.

Sin la gbandera, solo probará la primera.

Sachleen
fuente
1
Entonces, el indicador / g es irrelevante cuando se usa la función .test, porque solo encuentra la primera coincidencia de todos modos, ¿verdad?
xr280xr
10
@ xr280xr No es irrelevante, es más contraproducente. Romperá las cosas si reutiliza RegExp. var r = /a/g; console.log(r.test('a'), r.test('a')); // true false
Janosch
41

Ejemplo en Javascript para explicar:

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

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

g es la bandera de búsqueda global.

La marca de búsqueda global hace que la RegExp busque un patrón a lo largo de la cadena, creando una matriz de todas las ocurrencias que puede encontrar que coincidan con el patrón dado.

Entonces, la diferencia entre /.+/gy /.+/ es que la gversión encontrará cada ocurrencia en lugar de solo la primera.

Davepmiller
fuente
9

No hay diferencia entre /.+/gy /.+/porque ambos solo coincidirán con la cadena completa una vez. La gmarca una diferencia si la expresión regular podría coincidir más de una vez o contiene grupos, en cuyo caso se .match()devolverá una matriz de los partidos en lugar de una matriz de los grupos.

Neil
fuente
8

Como señaló @matiska, la gbandera también establece la lastIndexpropiedad.

Un efecto secundario muy importante de esto es que si está reutilizando la misma instancia de expresión regular contra una cadena coincidente, eventualmente fallará porque solo comienza a buscar en el 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
fuente
6

Además del significado de gbandera ya mencionado , influye en la regexp.lastIndexpropiedad:

LastIndex es una propiedad entera de lectura / escritura de instancias de expresiones regulares que especifica el índice en el que comenzar la siguiente coincidencia. (...) Esta propiedad se establece solo si la instancia de expresión regular usó el indicador "g" para indicar una búsqueda global.

Referencia: Mozilla Developer Network

matiska
fuente
3

G en expresiones regulares define una búsqueda global, lo que significa que buscaría todas las instancias en todas las líneas.

Neonguardiano
fuente
1

Dará un ejemplo basado en una cadena. Si queremos eliminar todas las ocurrencias de una cadena. Digamos si queremos eliminar todas las apariciones de "o" con "" de "hola mundo"

"hello world".replace(/o/g,'');
Deepak
fuente
0
  1. g -> devuelve todos los partidos
  2. without g -> devuelve el primer partido

ejemplo:

  1. '1 2 1 5 6 7'.match(/\d+/)devuelve ["1", index: 0, input: "1 2 1 5 6 7", groups: undefined]. Como ves, solo podemos llevarnos el primer partido "1".
  2. '1 2 1 5 6 7'.match(/\d+/g)devuelve una matriz de todas las coincidencias ["1", "2", "1", "5", "6", "7"].
Nagibaba
fuente
1
Explíquelo con más detalle: ¿cuál es la diferencia entre "todos los partidos" y "primer partido"?
Nico Haase
Expliqué más. Gracias por su orientación
Nagibaba
@NicoHaase, ¿puedes eliminar tu tasa negativa? Traté de ser más explicativo.
Nagibaba
Perdón por el malentendido :)
Nagibaba