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

intelis
fonte

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.

sachleen
fonte
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' ]
Luke W
fonte
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.

Davepmiller
fonte
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.

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

cchamberlain
fonte
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

matiska
fonte
3

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

Neonguardian
fonte
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,'');
Deepak
fonte
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"].
Nagibaba
fonte
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