文字列の置換

作成日 : 2002-12-03
最終更新日 :

文字列の置換

文字列の置換は、文字列の検索と合わせてプログラムでは必須の操作である。 置換には単純な置換と動的な置換がある。動的な置換は、正規表現などの検索の結果によって、 操作を変更できるものをいう。

なお、以前は正規表現による検索も合わせて説明していたが、 その内容の一部は「正規表現とパターンマッチング」 に移し、一部は削除した。

substring と slice

単純な文字列の置換には、substringslice がある。 どちらも s で始まる関数でこんがらがるので、整理する。

以下、エスペラントの単語 malsanulo (病人)をもとに、説明していく。 この言葉は、sana (健康な) (語幹 san と形容詞を表す語尾 a の組み合わせ)から派生したことばで、 反対を意味する mal が接頭辞となって malsana で「病気の」という意味になる。 さらに、人を表す接尾辞 ul を末尾に、もう一つおまけに名詞を表す o を末尾につけて、 malsanulo ができあがる。これは病人を表す。

substring

substring(m) または、substring(m, n) とする。 引数 m, n はどちらも整数である。 引数が 1 つ、すなわち m のみの場合、m が負でない整数であれば先頭の数字から数えて(先頭は 0 で数える) m 番目から末尾までの文字列を返す。m が 負の整数であれば、m = 0 とみなされる。 引数が 2 つの場合は、先頭から m 番目から 先頭から n - 1 個めまでの文字をとる。

"malsanulo".substring(0) // => malsanulo

"malsanulo".substring(3) // => sanulo(反対を表す mal が取れたので、sanulo は「健康な人」を表す)。

"malsanulo".substring(-3) // => malsanulo

"malsanulo".substring(3, 6) // => san( san は「健康な」という形容詞 sana の語幹)。

slice

slice(m) または slice(m, n) である。 引数 m, n はどちらも整数である。 引数が 1 つ、すなわち m のみの場合、その引数 m が負でない整数であれば先頭頭の数字から数えて(先頭は 0) m 番目から末尾までの文字列を返す。m が負の整数であれば、後ろから数える。-1 ならば末尾の数字から、-2 なら 末尾から 2 番目の数字から数える。 引数が 2 つの場合は、先頭から m 番目から 先頭から n 番目 の文字をとる。n に関しても負の数を許す。 数え方は m と同様。

"malsanulo".slice(0) // => malsanulo

"malsanulo".slice(3) // => sanulo (この場合は、メソッド substring(3) と同じ)。

"malsanulo".slice(-3) // => ulo (この場合は、メソッド substring(-3) と異なり、後ろから数えて3文字分を取る。 ulo は「人」)。

"malsanulo".slice(-3, -1) // => ul(後ろから数えて 3 文字分から後ろから数えて 1 文字を落とす。ul は人を意味する接尾辞)。

なお、以前は substr メソッドの説明もしていたが、これは非推奨となったので削除した(2020-03-25)。

動的な置換

正規表現を用いて動的な置換をすることができる。 JavaScript の正規表現を使った置換は replace メソッドである。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/replace

このとき、RegExp.$1などの後方参照を使うときのコツがある。 その場で後方参照を使うときには、無名関数を使うのである。

let str = "kondowa634toyariaunode8940niwa4649tsutaetekure"
let str1 = str.replace(/(\d+)/g, function(){return ` ( ${RegExp.$1} ) `}) // => kondowa (634) toyariaunode (8940) niwa (4649) tsutaetekure

なお、replace は静的な置換も可能である。

まりんきょ学問所JavaScript 手習い > 文字列の置換


MARUYAMA Satosi