Qual é o problema dessa expressão regular quando eu uso a bandeira global e a bandeira que não diferencia maiúsculas de minúsculas? Consulta é uma entrada gerada pelo usuário. O resultado deve ser [verdadeiro, verdadeiro].
var query = 'Foo B';
var re = new RegExp(query, 'gi');
var result = [];
result.push(re.test('Foo Bar'));
result.push(re.test('Foo Bar'));
// result will be [true, false]
var reg = /^a$/g;
for(i = 0; i++ < 10;)
console.log(reg.test("a"));
javascript
regex
sobre
fonte
fonte
re
.Respostas:
O
RegExp
objeto controlalastIndex
onde ocorreu uma correspondência, portanto, nas correspondências subsequentes, ele começará no último índice usado, em vez de 0. Dê uma olhada:Se você não deseja redefinir manualmente
lastIndex
para 0 após cada teste, basta remover og
sinalizador.Aqui está o algoritmo que as especificações determinam (seção 15.10.6.2):
fonte
lastIndex
está nas etapas 5, 6 e 11. Sua declaração de abertura é verdadeira apenas se a bandeira global estiver configurada.Você está usando um único
RegExp
objeto e o executa várias vezes. Em cada execução sucessiva, continua a partir do último índice de correspondência.Você precisa "redefinir" a regex para iniciar do início antes de cada execução:
Dito isto, pode ser mais legível criar um novo objeto RegExp a cada vez (a sobrecarga é mínima, pois o RegExp é armazenado em cache de qualquer maneira):
fonte
g
bandeira.RegExp.prototype.test
atualiza alastIndex
propriedade das expressões regulares para que cada teste comece onde o último parou. Eu sugiro usar,String.prototype.match
uma vez que não atualiza alastIndex
propriedade:Nota:
!!
converte para um booleano e depois inverte o booleano para refletir o resultado.Como alternativa, você pode apenas redefinir a
lastIndex
propriedade:fonte
A remoção do
g
sinalizador global corrigirá seu problema.Deveria estar
fonte
O uso do sinalizador / g indica para continuar pesquisando após um hit.
Se a correspondência for bem-sucedida, o método exec () retornará uma matriz e atualizará as propriedades do objeto de expressão regular.
Antes da sua primeira pesquisa:
Após a primeira pesquisa
Remova o ge ele sai da pesquisa após cada chamada para exec ().
fonte
exec
.Você precisa definir re.lastIndex = 0 porque, com o sinalizador g, regex mantém o controle da última correspondência ocorrida, portanto, o teste não irá testar a mesma sequência, para isso você precisa fazer re.lastIndex = 0
fonte
Eu tinha a função:
A primeira chamada funciona. A segunda ligação não. A
slice
operação reclama de um valor nulo. Presumo que isso é por causa dore.lastIndex
. Isso é estranho, porque eu esperaria que um novoRegExp
fosse alocado toda vez que a função for chamada e não compartilhada entre várias invocações da minha função.Quando mudei para:
Então eu não recebo o
lastIndex
efeito de ressaca. Funciona como eu esperava.fonte