我有一个文本数组lines
和一个terms
数组,每个term
行包含一对单词。例如,terms
数组可能类似于:
blue, red
high, low
free, bound
...
对于lines
数组中的每一行,我需要浏览所有terms
的列表,并用第二个单词替换第一个单词的每个出现位置;全局和不区分大小写。例如,行
The sky is Blue and High, very blue and high, yet Free
会变成
The sky is red and low, very red and low, yet bound
这样的代码:
function filter(lines,terms){
for (line of lines){
for (term of terms){
tofind = term[0]; //this is a string not RegExp
//still needs the 'gi' flags
toreplace = term[1];
line = line.replace(tofind,toreplace);
}
}
}
这是错误的,因为tofind
需要是RegExp(pattern,'gi'),并且需要在循环内的每次迭代中动态生成。
如果tofind
字符串是静态的,我们可以做到:
line = line.replace(/some-static-text-here/gi,toreplace)
我尝试了line.replace(new RegExp(tofind,'gi'),toreplace)
,但这会引发错误Invalid regular expression: /*Contains/: Nothing to repeat
所以,问题是:如何在循环内动态修改RegExp对象的模式?
答案 0 :(得分:0)
如果术语数组仅包含字母数字值,则可以构建新的正则表达式。
function filter(lines, terms) {
return lines.map(s =>
terms.reduce((r, t) => r.replace(new RegExp(t[0], 'gi'), t[1]), s));
}
console.log(filter(['The sky is Blue and High, very blue and high, yet Free'], [['blue', 'red'], ['high', 'low'], ['free', 'bound']]));