
複数の文字列置換について
JavaScriptでreplaceで文字列を置換する際に複数の文字列を置換したいことがある。
例えば以下の表のように置換前の用語を置換後にするなど。
置換前 | 置換後 |
火 | fire |
水 | water |
風 | wind |
例として置換するテキストは以下の通りとする。
(説明の簡略化のため火炎などの用語は含まれないものとする)
■ replaceで置換前のテキスト 火と水と風と火 ■ replaceで置換後のテキスト fireとwaterとwindとfire
上記の置換でよくあるのはreplaceを連続使用した置換だ。
let text = '火と水と風と火'
text = text.replace(/火/gm, 'fire')
text = text.replace(/水/gm, 'water')
text = text.replace(/風/gm, 'wind')
console.log(text)
// => fireとwaterとwindとfire
ただ、このコードだと用語が数十個と多くなるケースだと行数が増えて可読性が低く、置換前と置換後の用語も編集しづらい状態になってしまう。
そのため人によっては配列を使用して以下のようにreduceで順に置換した結果を返していることがある。
const text = '火と水と風と火'
const r1 = ['火', '水', '風']
const r2 = ['fire', 'water', 'wind']
const result = r1.reduce((a, c, i) => {
const reg = new RegExp(r1[i], 'gm')
c = a.replace(reg, r2[i])
return c
}, text)
console.log(result)
reduceの使用でreplaceは1つになったが、配列だとJavaScriptコード内の置換前と置換後の用語が多くなるので、同じく可読性が低下してしまう。
JSONに置換用語をまとめる
この問題は以下のようにJSONファイルに置換前と置換後のまとめて処理すれば解決できる。
{
"火": "fire",
"水": "water",
"風": "wind"
}
これなら配列よりも編集しやすいし、GoogleスプレッドシートはJSONの書き出しが可能なので用語の管理もしやすい。
JSONファイルはfetchで読み込んで以下のようにreplaceで置換する。
fetch('replace.json')
.then(res => res.json())
.then(data => {
let result = '火と水と風と火'
for (const [key, value] of Object.entries(data)) {
const reg = new RegExp(key, 'gm')
result = result.replace(reg, value)
}
document.getElementById('result').textContent = result
})