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?


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");

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 .


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);
}

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")

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 ).


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.


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)

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

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.

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.