regex JavaScript正则表达式替换为位置数组[重复]

i5desfxk  于 2022-11-18  发布在  Java
关注(0)|答案(5)|浏览(141)

此问题在此处已有答案

Replace regular expression matches with array of values(1个答案)
6天前关闭。
我尝试使用正则表达式来替换JavaScript模板中的位置值。
例如,如果我有以下内容:

const myTemplate = "First: {}, Second: {}, Third: {}";
const myValues = ["A", "B", "C"];

我想把myValues中的项目Map到myTemplate中的{}占位符,并在相应的位置上进行匹配,因此结果将是First: A, Second: B, Third: C
我尝试过如下方法,但是没有用,因为replace不接受数组:

const myTemplate = "First: {}, Second: {}, Third: {}";
const myValues = ["A", "B", "C"];
const regexStr = /{}/g;
const result = myTemplate.replace(regexStr, myValues);

我想我可以传递一个函数给replace(),但是它没有一个参数来表示被“替换”的索引。

sf6xfgos

sf6xfgos1#

您可以将replace()shift()搭配使用。

const myTemplate = "First: {}, Second: {}, Third: {}";
const myValues = ["A", "B", "C"];
const regexStr = /{}/g;
const result = myTemplate.replace(regexStr, () => myValues.shift());

console.log(result)

这里假设myValue中有足够的项,如果你不确定,你可以添加一个备用项:(myValues.shift() || 'FallBack')

const myTemplate = "First: {}, Second: {}, Third: {}";
const myValues = ["A"];
const regexStr = /{}/g;
const result = myTemplate.replace(regexStr, () => myValues.shift() || "FallBack");

console.log(result)
mxg2im7a

mxg2im7a2#

您可以像这样使用.splice()

const myTemplate = "First: {}, Second: {}, Third: {}";
const myValues = ["A", "B", "C"];
const regexStr = /{}/g;
const result = myTemplate.replace(regexStr, () => myValues.splice(0, 1));

console.log(result);
t2a7ltrp

t2a7ltrp3#

如果没有regex,您可以使用split,然后使用reduce将值与分区合并:

const myTemplate = "First: {}, Second: {}, Third: {}";
const myValues = ["A", "B", "C"];

const result = myTemplate.split("{}")
    .reduce((a, b, i) => a + myValues[i-1] + b)

console.log(result);

注意:这不会使myValues发生突变。

csbfibhn

csbfibhn4#

简单地重复替换相同的字符串怎么样?

let myTemplate = "First: {}, Second: {}, Third: {}";
const myValues = ["A", "B", "C"];

for (const val of myValues) {
  myTemplate = myTemplate.replace('{}', val)
}

console.log(myTemplate)
xqk2d5yq

xqk2d5yq5#

一种可能的基于replace的解决方案利用bind将替换值数组转换为替换函数,其中,对于每个替换函数调用,通过从绑定数组中shift转换该值,绑定数组返回正确的替换值(从而改变后者)。
第一个
在例如myValues的封装和/或突变不重要的情况下,可以简化相同的方法,如下面的示例所示...
第一次

相关问题