2016-08-31 158 views
2

我有以下2個字符串,我想用另一個字替換單詞的出現。這裏是一個例子:替換兩個字符串中的子字符串

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

var result = solution(str1, str2) 

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

在這裏,我想用適當的模板替換每個星號。

+0

str1和str2是否總是這樣? –

+0

@TobiasK。不,它們並不總是一樣的。但是,他們有相同的模式。 –

回答

2

您可以使用此ES6功能,使用replace回調參數:

function solution (str1, str2) { 
 
    var replacements = str1.match(/\{\{.*?\}\}/g); 
 
    return str2.replace(/\*/g, match => replacements.shift() || ''); 
 
} 
 

 
// test case 
 
var str1 = 'My name is {{ firstName }} {{ lastName }}'; 
 
var str2 = 'Me llamo * *'; 
 
// match 
 
var result = solution(str1, str2); 
 
// output 
 
console.log(result);

簡單地刪除沒有雙支架對計數器部件的星號。

0

如果兩個字符串總是喜歡你的例子,那麼:

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

 
var result = solution(str1, str2) 
 

 
console.log(result) 
 
console.log(result == 'Me llamo {{ firstName }} {{ lastName }}') 
 

 
function solution(str1, str2){ 
 
    return str2.substr(0, str2.length-3) + str1.substr('My name is '.length) 
 
} 
 

+0

如果兩個字符串總是相同的,那麼做一個函數的意義是什麼? – FrankerZ

+0

兩個字符串都不相同。儘管如此,它們也遵循相同的模式 –

1

你可以在每個索引處使用正則表達式來獲取所有的變量和替換每個*與變量:

var target = 'My name is {{ firstName }} {{ lastName }}'; 
 
var translation = 'Me llamo * *'; 
 

 
function translate(from, to) { 
 
    var interpolations = from.match(/(\{\{([\w\s]+)\}\})/g); 
 
    return to.replace(/\*/g, function(matches) { 
 
     return interpolations.shift() 
 
    }) 
 
} 
 

 
console.log(translate(target, translation));

+2

代碼片段具有顯示'console.log'項目條目的好功能。我試圖避免使用'alert()',因爲我發現該功能存在。 – FrankerZ

+0

啊,很高興知道(更新)!謝謝@FrankerZ - 我總是感覺嚴重使用警報:P –

+0

看來你的解決方案已經發展到我發佈的內容。 ;-) – trincot

0

可以使用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()); 
} 
+0

...和另一個副本相同的解決方案;-) – trincot

+0

@trincot它不是複製。首先,你在函數範圍內創建了一個新的變量,這是不需要的。其次,我認爲在字符串中留下'{{}}'字符並不是OP想要的,所以我也改進了它。 –

+0

同意這兩點是不同的。 – trincot

0

迭代少縮寫(但可能更慢)版本的更能容忍的數量不匹配*或{{}}:

var solution = function(s1, s2) { 
 
    var myRegexp = /(\{\{.*?\}\})/g; 
 
    var match = myRegexp.exec(s1); 
 
    while (match != null && s2.indexOf('*')!== -1) { 
 
    s2 = s2.replace('*', match[1]); 
 
    match = myRegexp.exec(s1); 
 
    }; 
 
    return s2; 
 
}; 
 

 

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

 
var result = solution(str1, str2); 
 
console.log(result);