首页 > 解决方案 > 带有变量的javascript RexEx没有产生预期的结果

问题描述

我正在尝试更新一个使用正则表达式检测诸如 ts-english、ts-german、ts-italian 之类的值的项目。此代码产生

var str = "ts-english";
let patt = /(?<=ts\-)\S+/i;
var res = patt.exec(str);
console.log (res)

输出:['english',索引:3,输入:'ts-english',组:未定义]

我希望能够在 for 循环中为 ts-1-english 做一些事情。我知道我应该在循环的每次迭代期间使用 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

标签: javascriptregexvariables

解决方案


您的代码的问题在于,当您使用 时new RegExp,您应该传递要构造的纯正则表达式/,不带分隔符,也不带标志。要使用标志,请在第二个参数中传递它们,例如:

new RegExp ("(?<=ts\\-" + q + "\\-)\\S+", 'i');

但是在可能的情况下使用正则表达式文字要容易得多;除其他外,您不必双重转义反斜杠。而且,在这种情况下,这是可能的。除了使用循环之外,您还可以使用与 、 或在所需点匹配的字符123其中[1-3]

const str = "ts-1-english";
const mpatt = /(?<=ts-[1-3]-)\S+/i;
const res = mpatt.exec(str);
console.log(res)

另请注意,Javascript 中的lookbehind 并未得到广泛支持。您可以考虑将 group 用于要提取的部分:

const str = "ts-1-english";
const mpatt = /ts-[1-3]-(\S+)/i;
const res = mpatt.exec(str);
console.log(res);


推荐阅读