2017-11-03 7 views
1

私は、文章の複数の場所でテキストを変更するアルゴリズムを探しています。 たとえば、次のテキストがあります。文の複数の場所でテキストを置き換える方法は?

レベッカ・ブラックは金曜日にどれくらいの金を出しましたか?

だから、私が必要とする2箇所を保持するオブジェクトを変更することがあります。

[{ 
    offset: 19, 
    length: 13 
}, { 
    offset: 45, 
    length: 6 
}] 

レベッカブラックを金曜日、同じまたは別のテキストに置き換えられる必要があります...実際にどのようメートル*だから私の文が のようになります...

問題ではない...のは、ツリーハウスと言ってみましょうUCHお金はツリーハウスのオフに作られたツリーハウスを持っている?私がこれまで持っている*

ソリューションは後方に実行し、1でのテキスト1を交換することです。ポジションが適切に割り当てられていることを確認しますが、少し複雑です。

アイデア?

+0

は... 25金曜日ないオフセット?何が得られないのですか – Dellirium

+0

変更したい単語/フレーズを正確に知っていますか?その場合、regexで '.replace'が役に立ちます。または、変更する文字列内の領域の位置と長さだけを知っていますか? – CRice

+1

最初の文字が置換される前または後に、2番目のテキスト(25)のオフセットがありますか? – Reeno

答えて

2

まず第一に、あなたはそれからちょうど希望stringでを置き換える機能を適用し、offsetフィールドによって配列をsortすることができます。

なぜ並べ替えですか?この問題では、我々はこの文字列のstartに文字列のendから置き換えることができますので

ないなら、私たちは以下の問題を抱えている可能性:我々は小さなテキストと長いテキストを置き換えている場合が起こっているでしょうか?

次に、offsetsが文字列の長さを超えている可能性があります。

注:(オフセットが与えられた文字列の長さを超える場合には)我々は が与えられた文字列のを追い越していないことを保証していないが、それは与えられた配列sortingない溶液than方が良いでしょうソリューション。

let string='How much money has Rebecca Black made off of Friday?'; 
 

 
const replaceRange = (s, start, end, substitute) => s.substring(0, start) + substitute + s.substring(end); 
 

 
let array= 
 
[{ 
 
    offset: 19, 
 
    length: 13 
 
}, { 
 
    offset: 40, 
 
    length: 2 
 
}]; 
 
array.sort(function(a,b){ 
 
    return b.offset-a.offset; 
 
}).forEach(function(item){ 
 
    string=replaceRange(string,item.offset,item.offset+item.length,"XX"); 
 
}); 
 
console.log(string);

+0

コードを実行するとわかるように、バグがあります。置換後の文字列の変更された長さを考慮してオフセットをシフトしません。その結果、 "XX"は "Friday"の代わりに "f"を置き換えます。 –

+0

@rory fridayはサンプルデータに置き換えられません... –

+0

"X" .repeat(offset.length)と置き換えて、並べ替える必要はありません。 –

1
var input = "How much money has Rebecca Black made off of Friday?"; 
var mask = [{ 
    offset: 19, 
    length: 13 
}, { 
    offset: 25, 
    length: 6 
}]; 

function replaceMask(input, mask){ 
    var result = ""; 
for(var i = 0; i < input.length; i++){ 
    if(mask.find(rule => i > rule.offset && i < (rule.offset + rule.length))){ 
    result += "X"; 
    }else{ 
    result += input[i]; 
    } 
} 
return result; 
} 

console.log(replaceMask(input, mask)); 

Try it

1

技術的にはこれは、トリックを行い、しかし、あなたのサンプルデータが重複しています。私はそれが動作することを示すために異なるデータを使用しました。

私が意味

var data = "How much money has Rebecca Black made off of Friday?".split(''); 
 

 
replace = [{ 
 
    offset: 19, 
 
    length: 13 
 
}, { 
 
    offset: 0, 
 
    length: 3 
 
}]; 
 

 
replace.forEach(function(el) { 
 
     data.forEach(function(dataElement, index) { 
 
      if (index >= el.offset && index < (el.offset + el.length)) 
 
      \t data[index] = "X"; 
 
      }) 
 
     }) 
 
data = data.join(''); 
 
console.log(data);

関連する問題