Estou projetando um testador de expressões regulares em HTML e JavaScript. O usuário digitará um regex, uma string e escolherá a função com a qual deseja testar (por exemplo, pesquisar, corresponder, substituir etc.) via botão de opção e o programa exibirá os resultados quando essa função for executada com os argumentos especificados. Naturalmente, haverá caixas de texto extras para substituir os argumentos extras.
Meu problema é obter a string do usuário e transformá-la em uma expressão regular. Se eu disser que eles não precisam ter //
o regex que inserem, eles não podem definir sinalizadores, como g
e i
. Portanto, eles precisam ter os caracteres //
ao redor da expressão, mas como posso converter essa string em um regex? Não pode ser um literal, pois é uma string, e não posso transmiti-lo ao construtor RegExp, pois não é uma string sem os //
. Existe alguma outra maneira de transformar uma sequência de entrada do usuário em uma regex? Terei que analisar a string e as bandeiras do regex com os //
e depois construí-lo de outra maneira? Devo fazê-los inserir uma sequência e inserir as bandeiras separadamente?
fonte
var re = new RegExp("\\w+");
<input>
tag HTML.var re = new RegExp("\"\\w+\"");
é um exemplo de um regex codificado usando o construtor RegExp e é necessário o escape das aspas duplas . O que quero dizer com uma string em uma variável é que você pode fazervar re = new RegExp(str);
estr
pode conter aspas duplas ou barras invertidas sem problemas.ou
fonte
/\/
é reconhecida.Aqui está uma frase:
str.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&')
Eu o peguei no módulo NPM de escape-string-regexp .
Experimentando:
Usando literais de modelo marcados com suporte a sinalizadores:
fonte
Use o construtor de objeto JavaScript RegExp .
Você pode passar sinalizadores como um segundo argumento de string para o construtor. Veja a documentação para detalhes.
fonte
No meu caso, a entrada do usuário algumas vezes foi cercada por delimitadores e às vezes não. por isso adicionei outro caso ..
fonte
.split()
função em vez de uma longa seqüência de caracteres regex.regParts = inputstring.split('/')
isso criariaregParts[1]
a sequência de caracteres regex eregParts[2]
os delimitadores (assumindo que a configuração do regex seja/.../gim
). Você pode verificar se há delimitadores comregParts[2].length < 0
.Sugiro que você também adicione caixas de seleção separadas ou um campo de texto para os sinalizadores especiais. Dessa forma, fica claro que o usuário não precisa adicionar nenhum
//
. No caso de uma substituição, forneça dois campos de texto. Isso tornará sua vida muito mais fácil.Por quê? Porque, caso contrário, alguns usuários adicionarão
//
, enquanto outros não. E alguns cometerão um erro de sintaxe. Então, depois de remover os//
's, você pode acabar com uma regex sintaticamente válida que não é nada parecida com o que o usuário pretendia, levando a um comportamento estranho (da perspectiva do usuário).fonte
Isso funcionará também quando a string for inválida ou não contiver sinalizadores etc.:
fonte
Se você realmente deseja converter uma string em uma regex, tente usar a seguinte função:
Você pode usá-lo assim:
Para referência, aqui está a versão formatada e mais moderna:
fonte
Graças às respostas anteriores, esses blocos servem bem como uma solução de uso geral para aplicar uma string configurável em um RegEx .. para filtrar texto:
fonte
Você pode pedir sinalizadores usando caixas de seleção e fazer algo assim:
fonte
Eu uso
eval
para resolver este problema.Por exemplo:
fonte