Qual é o significado do sinalizador ‘g’ em expressões regulares?

Qual é o significado da bandeira g em expressões regulares?

Qual é a diferença entre /.+/g e /.+/ ?

g é para pesquisa global. Significa que vai corresponder a todas as ocorrências. Você normalmente também verá i que significa ignorar maiúsculas e minúsculas.

Referência: global – JavaScript | MDN

O sinalizador “g” indica que a expressão regular deve ser testada em todas as correspondências possíveis em uma string.

Sem a bandeira g , só testará pela primeira vez.

Exemplo em Javascript para explicar:

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

g é o sinalizador de pesquisa global.

O sinalizador de pesquisa global faz com que o RegExp pesquise um padrão em toda a string, criando uma matriz de todas as ocorrências que ele pode encontrar correspondentes ao padrão fornecido.

Portanto, a diferença entre /.+/g e /.+/ é que a versão g encontrará todas as ocorrências em vez de apenas a primeira.

Não há diferença entre /.+/g e /.+/ porque ambos irão corresponder apenas a string inteira uma vez. O g faz diferença se a expressão regular puder corresponder mais de uma vez ou contiver grupos, caso em que .match() retornará uma matriz das correspondências em vez de uma matriz dos grupos.

Como @matiska apontou, o sinalizador g define a propriedade lastIndex .

Um efeito colateral muito importante disso é que, se você estiver reutilizando a mesma instância de regex em relação a uma string correspondente, ela eventualmente falhará, pois só começará a pesquisar no 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); 

Além do já mencionado significado de g flag, ele influencia a propriedade regexp.lastIndex :

O lastIndex é uma propriedade inteira de leitura / gravação de instâncias de expressão regular que especifica o índice no qual iniciar a próxima correspondência. (…) Essa propriedade é configurada apenas se a instância da expressão regular tiver usado o sinalizador “g” para indicar uma pesquisa global.

Referência: Mozilla Developer Network

G em expressões regulares é um define uma pesquisa global, o que significa que ele procuraria todas as instâncias em todas as linhas.