Я пытаюсь обновить проект, который определяет значение, такое как ts-english, ts-german, ts-italian, используя регулярное выражение. этот код производит
var str = "ts-english";
let patt = /(?<=ts\-)\S+/i;
var res = patt.exec(str);
console.log (res)
output: ['english', index: 3, input: 'ts-english', groups: undefined]
Я хочу иметь возможность сделать что-то для ts-1-english в цикле for. Я понимаю, что я должен использовать RegEx для установки переменной во время каждой итерации цикла.
var str = "ts-1-english";
for (q=1; q <= 3; q++){
var mpatt = new RegExp ("/(?<=ts\\-" + q + "\\-)\\S+/i")
console.log (mpatt)
var res = mpatt.exec(str);
console.log ("q: " + (q) + " result of test: " + res)
}
это мой вывод.
//(? <= ts-1 -)\S+/i/q: 1 результат теста: null
//(? <= ts-2 -)\S+/i/q: 2 результат теста: null
//(? <= ts-3 -)\S+/i/q: 3 результат теста: null
Проблема с вашим кодом заключается в том, что при использовании new RegExp
вы должны передать простое регулярное выражение, которое вы хотите построить, без /
разделителей и без флагов. Чтобы использовать флаги, передайте их во втором аргументе, например:
new RegExp ("(?<=ts\\-" + q + "\\-)\\S+", 'i');
Но гораздо проще использовать литералы регулярных выражений, когда это возможно; вам не нужно дважды избегать обратных косых черт, среди прочего. И в этом случае это возможно. Вместо использования цикла вы можете вместо этого использовать набор символов, который соответствует 1
, 2
или 3
в нужной точке, с [1-3]
:
const str = "ts-1-english";
const mpatt = /(?<=ts-[1-3]-)\S+/i;
const res = mpatt.exec(str);
console.log(res)
Также обратите внимание, что lookbehind в Javascript не поддерживается широко; вы можете подумать об использовании группы для части, которую вы хотите извлечь:
const str = "ts-1-english";
const mpatt = /ts-[1-3]-(\S+)/i;
const res = mpatt.exec(str);
console.log(res);