Javascript 在两个字符串之间替换子字符串

Javascript 在两个字符串之间替换子字符串,javascript,Javascript,我有以下两个字符串,我想用另一个单词替换出现的单词。以下是一个例子: var str1 = 'My name is {{ firstName }} {{ lastName }}' var str2 = 'Me llamo * *' var result = solution(str1, str2) assert(result, 'Me llamo {{ firstName }} {{ lastName }}') 在这里,我想用适当的模板替换每个星号。如果两个字符串都像您的示例,那么: v

我有以下两个字符串,我想用另一个单词替换出现的单词。以下是一个例子:

var str1 = 'My name is {{ firstName }} {{ lastName }}'
var str2 = 'Me llamo * *'

var result = solution(str1, str2)

assert(result, 'Me llamo {{ firstName }} {{ lastName }}')

在这里,我想用适当的模板替换每个星号。

如果两个字符串都像您的示例,那么:

var str1='我的名字是{{firstName}{{lastName}}'
var str2='Me llamo**'
var结果=溶液(str1、str2)
console.log(结果)
log(结果='Me llamo{{firstName}}{{lastName}}}'
功能解决方案(str1、str2){
返回str2.substr(0,str2.length-3)+str1.substr('My name is'.length)
}

您可以使用此ES6函数,使用
replace
回调参数:

功能解决方案(str1、str2){
var replacements=str1.match(/\{\{.*.\}}/g);
返回str2.replace(/\*/g,match=>replacements.shift()| |“”);
}
//测试用例
var str1='我的名字是{{firstName}}{{lastName}}';
var str2='Me llamo**';
//匹配
var结果=溶液(str1、str2);
//输出

控制台日志(结果)您可以使用正则表达式获取所有变量,并用每个索引处的变量替换每个*:

var target='我的名字是{{firstName}}{{lastName}}';
var translation='Me llamo**';
函数转换(从、到){
变量插值=from.match(/(\{{([\w\s]+)\})/g);
返回到.replace(/\*/g,函数(匹配项){
返回插值.shift()
})
}

日志(翻译(目标,翻译))您可以使用
Array.prototype.replace
函数来完成

var str1 = 'My name is {{ firstName }} {{ lastName }}';
var str2 = 'Me llamo * *';

var result = solution(str1, str2);

console.log(result);

function solution(str1, str2){
    str1 = str1.match(/\{\{.*?\}\}/g);
    return str2.replace(/\*/g, () => str1.shift());
}
然而,我认为从字符串中删除
{{}
标记会更有用。您可以通过以下方式实现:

function solution(str1, str2){
    str1 = str1.match(/\{\{.*?\}\}/g).map(m => m.match(/\{\{\s(.*)\s\}\}/)[1]);
    return str2.replace(/\*/g, () => str1.shift());
}

一种迭代的、不太缩写(但可能较慢)的版本,它更能容忍*或{{}数量上的不匹配:

var解决方案=函数(s1,s2){
var myRegexp=/(\{\{.*.\}})/g;
var match=myRegexp.exec(s1);
while(match!=null&&s2.indexOf('*')!=-1){
s2=s2。替换('*',匹配[1]);
match=myRegexp.exec(s1);
};
返回s2;
};
var str1='我的名字是{{firstName}}{{lastName}}';
var str2='Me llamo**';
var结果=溶液(str1、str2);

控制台日志(结果)str1和str2总是这样吗?@TobiasK。不,它们并不总是一样的。但是,它们有相同的模式。如果两个字符串总是相同的,那么创建函数有什么意义呢?两个字符串都不相同。但是它们遵循相同的模式。代码片段有一个很好的特性,可以显示console.log项的条目。我试图避免使用
alert()
,因为我发现该功能存在。啊,很高兴知道(更新)!谢谢@FrankerZ-我总是觉得使用alert很恶心:PIt看起来你的解决方案已经演变成我发布的了。;-)@trincot,lol-只是
shift()
调用,这比使用临时计数器变量要好得多。我们恰好想出了类似的解决方案。如果你想在答案中添加ES5版本,我很乐意删除我的:)。。。以及同一溶液的另一份副本;-)@trincot这不是复制品。首先,您在函数范围内创建了一个新变量,这是不必要的。其次,我认为在字符串中保留
{{}
字符并不是OP想要的,所以我也对它进行了改进。