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


110

Qual é o significado do gsinalizador em expressões regulares?

Qual é a diferença entre /.+/ge /.+/?

Respostas:


130

gé para pesquisa global. O que significa que corresponderá a todas as ocorrências. Normalmente, você também verá o ique 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 relação a todas as correspondências possíveis em uma string.

Sem a gbandeira, ele só testará a primeira.


1
Portanto, o sinalizador / g é irrelevante ao usar a função .test, porque ele só encontra a primeira correspondência de qualquer maneira, certo?
xr280xr

10
@ xr280xr Não é irrelevante, é mais contraproducente. Isso vai quebrar as coisas se você reutilizar o RegExp. var r = /a/g; console.log(r.test('a'), r.test('a')); // true false
Janosch,


41

Exemplo em Javascript para explicar:

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

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

10

g é a bandeira de pesquisa global.

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

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


9

Não há diferença entre /.+/ge /.+/porque os dois sempre corresponderão à string inteira uma vez. O gfaz diferença se a expressão regular pode corresponder mais de uma vez ou contém grupos, caso em que .match()irá retornar uma matriz dos jogos, em vez de uma matriz dos grupos.


8

Como @matiska apontou, o gsinalizador também define a lastIndexpropriedade.

Um efeito colateral muito importante disso é que se você estiver reutilizando a mesma instância de regex em uma string correspondente, ela acabará falhando porque só começa 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);


6

Ao lado do já mencionado significado de gbandeira, influencia a regexp.lastIndexpropriedade:

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. (...) Esta propriedade é definida apenas se a instância da expressão regular usou o sinalizador "g" para indicar uma pesquisa global.

Referência: Mozilla Developer Network


3

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


1

Dará exemplo baseado em string. Se quisermos remover todas as ocorrências de uma string. Digamos que se deseje remover todas as ocorrências de "o" com "" de "hello world"

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

0
  1. g -> retorna todas as partidas
  2. without g -> retorna a primeira partida

exemplo:

  1. '1 2 1 5 6 7'.match(/\d+/)retorna ["1", index: 0, input: "1 2 1 5 6 7", groups: undefined]. Como você vê, só podemos escolher a primeira partida "1".
  2. '1 2 1 5 6 7'.match(/\d+/g)retorna uma matriz de todas as correspondências ["1", "2", "1", "5", "6", "7"].

1
Explique isso melhor - qual é a diferença entre "todas as partidas" e "primeira partida"?
Nico Haase

Eu expliquei mais. Obrigado pela sua orientação
Nagibaba

@NicoHaase, você pode remover sua taxa negativa? Tentei ser mais explicativo.
Nagibaba

Desculpe pelo mal-entendido :)
Nagibaba
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.