2016-08-31 10 views
2

私は以下の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

あなたはreplaceコールバック引数を使用して、このES6機能を使用できます。

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);

関連する問題