Javascript Regex: Как поместить переменную в регулярное выражение? - PullRequest
169 голосов
/ 27 октября 2010

Так, например:

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

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

Ответы [ 9 ]

234 голосов
/ 27 октября 2010
var regex = new RegExp("ReGeX" + testVar + "ReGeX");
...
string.replace(regex, "replacement");

Обновление

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

73 голосов
/ 27 октября 2010

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

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

Тогда вы можете построить regexstring любым удобным вам способом.

Подробнее об этом можно прочитать здесь .

30 голосов
/ 16 января 2013

Чтобы построить регулярное выражение из переменной в 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);
}
6 голосов
/ 27 октября 2010

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

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

5 голосов
/ 05 апреля 2018

, если вы используете es6 литералы шаблона - это опция ...

string.replace(new RegExp(`ReGeX${testVar}ReGeX`), "replacement")
2 голосов
/ 08 июня 2018

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

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

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

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

// that makes dynamicRegExp = /findMe/gi
1 голос
/ 11 мая 2019

Необходимо только сначала подготовить строковую переменную, а затем преобразовать ее в 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.

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

1 голос
/ 26 декабря 2018

Вы можете создавать регулярные выражения в 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.

1 голос
/ 17 февраля 2018

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

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...