Javascript Regex: Как поместить переменную в регулярное выражение?

Итак, например:

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

Но это, конечно, не работает:) Есть ли способ сделать это?

Ответы

Ответ 1

var regex = new RegExp("ReGeX" + testVar + "ReGeX");
...
string.replace(regex, "replacement");

Update

В некоторых комментариях важно отметить, что вы можете захотеть escape эту переменную, если есть вероятность для вредоносного контента (например, переменная возникает из пользовательский ввод)

Ответ 2

Вы можете использовать объект RegExp:

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

Затем вы можете построить regexstring любым способом.

Подробнее об этом можно узнать .

Ответ 3

Чтобы создать регулярное выражение из переменной в JavaScript, вам нужно будет использовать конструктор RegExp со строковым параметром.

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

конечно, это очень наивный пример. Он предполагает, что input был правильно экранирован для регулярного выражения. Если вы имеете дело с пользовательским вводом или просто хотите сделать его более удобным для соответствия специальным символам, вам нужно выполнить специальные символы:

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

Ответ 4

Вы всегда можете "ReGeX" + testVar + "ReGeX" регулярное выражение в виде строки, то есть "ReGeX" + testVar + "ReGeX". Возможно, вам придется экранировать некоторые символы внутри вашей строки (например, двойные кавычки), но в большинстве случаев это эквивалентно.

Вы также можете использовать конструктор RegExp для передачи флагов (см. Документацию).

Ответ 5

если вы используете литералы шаблона es6 вариант...

string.replace(new RegExp('ReGeX${testVar}ReGeX'), "replacement")

Ответ 6

принятый ответ не работает для меня и не следует примерам MDN

см. раздел "Описание" в ссылке выше

Я бы пошел со следующим это работает для меня:

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

// that makes dynamicRegExp = /findMe/gi

Ответ 7

Здесь довольно бесполезная функция, которая возвращает значения, заключенные в определенные символы. :)

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)

Ответ 8

Вы можете создавать регулярные выражения в JS одним из двух способов:

  1. Использование литерала регулярного выражения - /ab{2}/g
  2. Использование конструктора регулярных выражений - new RegExp("ab{2}", "g").

Литералы регулярных выражений являются константами и не могут использоваться с переменными. Это может быть достигнуто с помощью конструктора. Структура конструктора RegEx

new RegExp(regularExpressionString, modifiersString)

Вы можете встраивать переменные как часть normalExpressionString. Например,

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

Это будет соответствовать любому внешнему виду шаблона cdcdcd.

Ответ 9

Необходимо только подготовить строковую переменную, а затем преобразовать ее в RegEx.

например:

Вы хотите добавить minLength и MaxLength с переменной в 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
}

Теперь, если вы измените значение MaxLength или MinLength, оно изменится во всех RegEx.

Надеюсь быть полезным. Также извините за мой английский.