¿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 /.+/?

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.


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' ]

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.


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.


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


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


3

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


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,'');

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"].

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.