複雑な置換アルゴリズムに問題があります。最終的に、問題をこの最小限のコードに減らすことができました。
const input="test hello test world"
let start = 0
let output = [...input]
const replacements = []
for (let end = 0; end <= input.length; end++) {
const c = input[end]
if (c == ' ') {
if (start !== end) {
const word = input.substring(start, end).toLowerCase()
if (word == 'test') {
replacements.push({start, length:(end - start), text:'REPLACEMENT'})
}
}
start = end + 1
}
}
for(let i=replacements.length-1;i>=0;i--) {
output.splice(replacements[i].start, replacements[i].length, replacements[i].text)
}
console.log(output.join(''))
私の入力は"test hello test world"
で、期待される出力は ですが"REPLACEMENT hello REPLACEMENT world"
、実際には"REPLACEMENT hello tREPLACEMENTworld"
です。Twitter API から、JavaScript にはバイト位置と char インデックスを処理する奇妙な方法があることを思い出すことができます。したがって、問題はスマイリーによって気づかれずに引き起こされます。
置換が期待どおりに機能するように、コードを修正するにはどうすればよいですか? おまけの質問 なぜそれが起こっているのですか?