Так, наприклад:
function(input){
var testVar = input;
string = ...
string.replace(/ReGeX + testVar + ReGeX/, "replacement")
}
Але це, звичайно, не працює :) Чи є спосіб це зробити?
Так, наприклад:
function(input){
var testVar = input;
string = ...
string.replace(/ReGeX + testVar + ReGeX/, "replacement")
}
Але це, звичайно, не працює :) Чи є спосіб це зробити?
Відповіді:
const regex = new RegExp(`ReGeX${testVar}ReGeX`);
...
string.replace(regex, "replacement");
У деяких коментарях важливо зауважити, що ви можете вийти з змінної, якщо є потенціал для шкідливого вмісту (наприклад, змінна надходить від введення користувача)
У 2019 році це зазвичай пишеться за допомогою рядка шаблону, і вищевказаний код було оновлено. Оригінальна відповідь:
var regex = new RegExp("ReGeX" + testVar + "ReGeX");
...
string.replace(regex, "replacement");
regex
вираз
/\w+\//i
стаєnew RegExp("\\w+/", "i")
Ви можете використовувати об’єкт RegExp:
var regexstring = "whatever";
var regexp = new RegExp(regexstring, "gi");
var str = "whateverTest";
var str2 = str.replace(regexp, "other");
document.write(str2);
Тоді ви можете побудувати regexstring
будь-яким способом.
Більше про це можна прочитати тут .
Щоб побудувати регулярний вираз зі змінної в 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);
}
ReGeX
текст. Тому я використав:return new RegExp(input, flags);
якщо ви використовуєте літеральні шаблони es6 - це варіант ...
string.replace(new RegExp(`ReGeX${testVar}ReGeX`), "replacement")
^[^\s]{${4},${32}}$
); export const validatePassword = value => value.match (newRegExp); `` `
Ви завжди можете надати регулярний вираз у вигляді рядка, тобто "ReGeX" + testVar + "ReGeX"
. Можливо, вам доведеться уникати деяких символів всередині рядка (наприклад, подвійна цитата), але в більшості випадків це еквівалентно.
Ви також можете використовувати RegExp
конструктор для передачі прапорів ( див. Документи ).
Ви можете створювати регулярні вирази в JS одним із двох способів:
/ab{2}/g
new RegExp("ab{2}", "g")
.Літерали регулярного виразу постійні, і їх не можна використовувати зі змінними. Цього можна досягти за допомогою конструктора. Стратегія конструктора RegEx є
new RegExp(regularExpressionString, modifiersString)
Ви можете вбудовувати змінні як частину regularExpressionString. Наприклад,
var pattern="cd"
var repeats=3
new RegExp(`${pattern}{${repeats}}`, "g")
Це буде відповідати будь-якій зовнішності візерунка cdcdcd
.
Ось досить непотрібна функція, яка повертає значення, обгорнуті певними символами. :)
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)
прийнята відповідь не працює для мене і не відповідає прикладами MDN
дивіться розділ "Опис" у посиланні вище
Я б пішов із наступним, що це працює для мене:
let stringThatIsGoingToChange = 'findMe';
let flagsYouWant = 'gi' //simple string with flags
let dynamicRegExp = new RegExp(`${stringThatIsGoingToChange}`, flagsYouWant)
// that makes dynamicRegExp = /findMe/gi
Потрібно лише спершу підготувати струнну змінну, а потім перетворити її в 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.
Сподіваюся, що буде корисно. Також шкода моєї англійської.