Javascript正则表达式用实际变量值替换字符串中的变量

时间:2019-11-19 00:50:57

标签: javascript regex

我希望"category/[categoryName]/[amount]"成为"category/movies/all"(用相同名称的变量的值替换“ [variable-name]”)。到目前为止,我已经有了这个,但是我缺少了一些东西:

let categoryName = "movies"; // example variable, set somewhere else
let amount = "all"; // example variable, set somewhere else
...
let searchUrl = "category/[categoryName]/[amount]"; // Set dynamically, could be any params
let regex = /\[(.+?)\]/ug;
searchUrl = searchUrl.replace(regex, window['$1']);

但是searchUrl的值只是变成“类别/未定义/未定义”。

我想做的甚至有可能吗?之前有人问过我的问题标题是否格式错误?我知道如何使用2个正则表达式执行此操作,首先获取变量名,然后在它们中循环并替换。但是我只想用一个“替换”来做。这可能吗,或者我必须使用2个正则表达式?

3 个答案:

答案 0 :(得分:2)

如果我正确地理解了这一点,并且可以按照您声明的那样动态地工作,则必须执行以下操作

app.get('*', (req, res) => {
  res.redirect('/app')
})
...other homeRoutes

您的动态变量必须为此工作全局存储!

答案 1 :(得分:0)

您是如此亲密!您现在尝试用不存在的全局变量[categoryName]替换$1。您要使用searchUrl.replace(regex, categoryName),假设categoryName是用正确的类别动态设置的。

答案 2 :(得分:0)

似乎.replace可以输入多个“替换”,因此您可以说str.replace(regex, replacer1, replacer2, replacer3...)。另外,您也可以传递一个函数,以在每次找到匹配的值时替换它。

我刚刚将您的代码修改为:

let categoryName = "movies"; // example variable, set somewhere else
let amount = "all"; // example variable, set somewhere else

// previous answer suggestion
// let replacers = [categoryName, amount];

let searchUrl = "category/[categoryName]/[amount]"; // Set dynamically, could be any params
let regex = /\[(.+?)\]/gu;
let replacers = searchUrl.match(regex).map( m => m.replace(/\[|\]/g,''));
searchUrl = searchUrl.replace(regex, () => { let val = eval(replacers.shift()); return val; });

output => "category/movies/all"

由于您的正则表达式是全局的,因此它会继续查找匹配项,但是由于原始代码中只有1个替换项,因此它将用该替换项替换匹配项。

categories/undefined/undefined(使用searchUrl.replace(regex, window['$1']);

您可能希望将替换项放入数组中。然后,对于每个匹配项,使用函数将匹配项替换为数组中存储的值,如上面的示例所示。

注意::此示例仅适用于2个匹配项。

希望这会有所帮助。

MDN - Specifying a function as a parameter