我希望"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个正则表达式?
答案 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个匹配项。
希望这会有所帮助。