javascriptのstringの特定のn文字目を変更することを考える。
あまり使う機会はないけど例えば数値文字列”122.333″の1の位を変えたいとか、復活の呪文の特定文字を変更したいとか。
色々な方法で置き換えてみます。
配列アクセス 失敗例
1 2 3 4 5 6 7 8 9 |
let str1 = "01234"; let str2 = "零壱弐参肆"; console.log(str1[2]); // 2 console.log(str2[2]); // 弐 str1[2] = "+"; str2[2] = "+"; console.log(str1); // 01234 console.log(str2); // 零壱弐参肆 |
切り出し slice, substr, substring
1 2 3 4 5 6 |
console.log(str1.slice(0, 2) + "*" + str1.slice(3)); // 01*34 console.log(str2.slice(0, 2) + "*" + str2.slice(3)); // 零壱*参肆 console.log(str1.substr(0, 2) + "#" + str1.substr(3)); // 01#23 console.log(str2.substr(0, 2) + "#" + str2.substr(3)); // 零壱#参肆 console.log(str1.substring(0, 2) + "%" + str1.substring(3, str1.length)); // 01%23 console.log(str2.substring(0, 2) + "%" + str2.substring(3, str1.length)); // 零壱%参肆 |
置き換え replace
1 2 3 |
//?<=肯定後読み, ^.{2}最初2文字, .変更対象 console.log(str1.replace(/(?<=^.{2})./, "+")); // 01+34 console.log(str2.replace(/(?<=^.{2})./, "+")); // 零壱+参肆 |
置き換え split().join()
1 2 |
console.log(str1.split(/(?<=^.{2})./).join("-")); // 01-34 console.log(str2.split(/(?<=^.{2})./).join("-")); // 零壱-参肆 |
今回の例だと結局正規表現を使うので特にこうする理由はなさそう。
どれを使ってもよさそうですが簡単で変なことが起きにくいsubstr
にしました。
1 2 3 4 5 6 7 |
const nthReplace = (str, n, after) => { return str.substr(0, n - 1) + after + str.substr(n); }; console.log(nthReplace(str1, 3, "!")); // 01!34 console.log(nthReplace(str2, 3, "!")); // 零壱!参肆 console.log(nthReplace(str1, 0, "!")); // !01234 console.log(nthReplace(str2, 10, "!"));// 零壱弐参肆! |