Regex Javascript: Como colocar uma variável dentro de uma expressão regular?

206

Então, por exemplo:

function(input){
    var testVar = input;
    string = ...
    string.replace(/ReGeX + testVar + ReGeX/, "replacement")
}

Mas é claro que isso não está funcionando :) Existe alguma maneira de fazer isso?

Adão
fonte
11
Esteja ciente de que, se você permitir que o usuário forneça essa variável, é fácil para um usuário mal-intencionado travar seu aplicativo por meio de um retorno catastrófico.
Tim Pietzcker 27/10/10
2
o que é "ReGeX"? é um nome de variável? isso torna as respostas confusas, ao sugerir que faz parte da construção do RegExp (no caso de um leitor não ver esses caracteres estranhos na pergunta).
Eduard

Respostas:

272
const regex = new RegExp(`ReGeX${testVar}ReGeX`);
...
string.replace(regex, "replacement");

Atualizar

Por alguns dos comentários, é importante observar que você pode querer escapar da variável se houver potencial para conteúdo malicioso (por exemplo, a variável vem da entrada do usuário)

Atualização do ES6

Em 2019, isso geralmente seria escrito usando uma string de modelo, e o código acima foi atualizado. A resposta original foi:

var regex = new RegExp("ReGeX" + testVar + "ReGeX");
...
string.replace(regex, "replacement");
Jason McCreary
fonte
5
Certifique-se de escapar da sua corda! Veja @zzzzBov resposta
jtpereyda
Isto não está funcionando no meu caso, você pode por favor ter um olhar este jsFiddle e deixe-me saber se o que eu tenho que fazer se eu quiser definir uma dinâmica código do país em regexexpressão
Kirankumar Dafda
10
Uma coisa importante a lembrar é que, nas cadeias regulares, o caractere \ precisa ser escapado, enquanto no regex literal (geralmente) o caractere / precisa ser escapado. Assim /\w+\//itornanew RegExp("\\w+/", "i")
Ali Ali
3
E o / g?
Qian Chen
Gente, eu preciso dividir esse regex /[^0-9.
max
79

Você pode usar o objeto RegExp:

var regexstring = "whatever";
var regexp = new RegExp(regexstring, "gi");
var str = "whateverTest";
var str2 = str.replace(regexp, "other");
document.write(str2);

Então você pode construir regexstringda maneira que quiser.

Você pode ler mais sobre isso aqui .

steinar
fonte
var characterCount = parseInt (attrs.limitCharacterCount); console.log (characterCount); var specialCharactersValidation = new RegExp ("/ ^ [a-zA-Z0-9] {" + characterCount + "} $ /"); / \ / ^ [a-zA-Z0-9] {7} $ \ // requestShipmentDirectives.js: 76 false main.js: 46 TypeError não capturado: Não é possível ler a propriedade 'offsetWidth' de null Isso é o que está acontecendo quando eu faço o RegEx Dynamic.
Ankit Tanna
31

Para criar uma expressão regular a partir de uma variável em JavaScript, você precisará usar o RegExpconstrutor com um parâmetro string.

function reg(input) {
    var flags;
    //could be any combination of 'g', 'i', and 'm'
    flags = 'g';
    return new RegExp('ReGeX' + input + 'ReGeX', flags);
}

claro, este é um exemplo muito ingênuo. Supõe que inputfoi escapado adequadamente para uma expressão regular. Se você está lidando com a entrada do usuário ou simplesmente deseja torná-lo mais conveniente para combinar caracteres especiais, precisará escapar de caracteres especiais :

function regexEscape(str) {
    return str.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')
}

function reg(input) {
    var flags;
    //could be any combination of 'g', 'i', and 'm'
    flags = 'g';
    input = regexEscape(input);
    return new RegExp('ReGeX' + input + 'ReGeX', flags);
}
zzzzBov
fonte
A única maneira de isso funcionar para mim era se eu excluí o ReGeXtexto. Então eu usei:return new RegExp(input, flags);
Michael Rader
2
@ MichaelRader, sim, o texto "ReGeX" fazia parte da pergunta e era usado como exemplo, não como algo necessário para fazer o código funcionar.
zzzzBov
1
lol acabei de perceber que era apenas o seu espaço reservado, mas como noob isso me levou algum tempo para descobrir. Obrigado.
quer
Entendo por que a string precisa ser escapada. Mas por que '\\ $ &' ​​é usado como um substituto
Sherin Binu
2
\\representa um único \caractere, $&é a substring correspondente .
precisa saber é o seguinte
7

se você estiver usando literais de modelo es6, é uma opção ...

string.replace(new RegExp(`ReGeX${testVar}ReGeX`), "replacement")
shunryu111
fonte
não funciona com literais de modelo. Estou usando o regexp para validar a senha no meu aplicativo e queria parametrizar o comprimento máximo e mínimo na minha string de expressão regular e isso não funciona. `` const newRegExp = new RegExp ( ^[^\s]{${4},${32}}$); exportar const validatePassword = value => value.match (newRegExp); ``
p7adams 30/08/19
6

Você sempre pode dar expressão regular como string, ou seja "ReGeX" + testVar + "ReGeX". Você possivelmente terá que escapar de alguns caracteres dentro de sua string (por exemplo, aspas duplas), mas na maioria dos casos é equivalente.

Você também pode usar o RegExpconstrutor para passar sinalizadores ( consulte a documentação ).

Nikita Rybak
fonte
3

Você pode criar expressões regulares em JS de uma das duas maneiras:

  1. Usando expressão regular literal - /ab{2}/g
  2. Usando o construtor de expressão regular - new RegExp("ab{2}", "g").

Literais de expressão regular são constantes e não podem ser usadas com variáveis. Isso pode ser alcançado usando o construtor. A estrutura do construtor RegEx é

new RegExp(regularExpressionString, modifiersString)

Você pode incorporar variáveis ​​como parte do regularExpressionString. Por exemplo,

var pattern="cd"
var repeats=3
new RegExp(`${pattern}{${repeats}}`, "g") 

Isso corresponderá a qualquer aparência do padrão cdcdcd.

Ben Carp
fonte
2

Aqui está uma função bastante inútil que retorna valores agrupados por caracteres específicos. :)

jsfiddle: https://jsfiddle.net/squadjot/43agwo6x/

function getValsWrappedIn(str,c1,c2){
    var rg = new RegExp("(?<=\\"+c1+")(.*?)(?=\\"+c2+")","g"); 
    return str.match(rg);
    }

var exampleStr = "Something (5) or some time (19) or maybe a (thingy)";
var results =  getValsWrappedIn(exampleStr,"(",")")

// Will return array ["5","19","thingy"]
console.log(results)
Jakob Sternberg
fonte
2

resposta aceita não funciona para mim e não segue exemplos MDN

consulte a seção "Descrição" no link acima

Eu iria com o seguinte está funcionando para mim:

let stringThatIsGoingToChange = 'findMe';
let flagsYouWant = 'gi' //simple string with flags
let dynamicRegExp = new RegExp(`${stringThatIsGoingToChange}`, flagsYouWant)

// that makes dynamicRegExp = /findMe/gi
Timothy Mitchell
fonte
1
Ainda funciona. A questão é que 'ReGeX' + testVar + 'ReGeX' torna a solução confusa. Adicionar um exemplo realmente esclareceria as coisas na minha opinião. var testVar = '321'; var regex = new RegExp ("[" + testVar + "] {2}", "g"); // acima equivalente a / [321] {2} / g
HelloWorldPeace 23/06
1

Só é necessário preparar a variável de sequência primeiro e depois convertê-la no RegEx.

por exemplo:

Você deseja adicionar minLengthe MaxLengthcom a variável ao RegEx:

function getRegEx() {
    const minLength = "5"; // for exapmle: min is 5
    const maxLength = "12"; // for exapmle: man is 12

    var regEx = "^.{" + minLength + ","+ maxLength +"}$"; // first we make a String variable of our RegEx
    regEx = new RegExp(regEx, "g"); // now we convert it to RegEx

    return regEx; // In the end, we return the RegEx
}

agora, se você alterar o valor de MaxLengthou MinLength, ele será alterado em todos os RegExs.

Espero ser útil. Também sinto muito pelo meu inglês.

Abbas Habibnejad
fonte