JavaScriptで文字列の一部を切り取り取得する substringメソッド完全ガイド

JavaScriptには、文字列から特定の部分を取得するための便利なメソッドがいくつかあります。今回はその中でも、substringメソッドにスポットを当て、その使用方法と特性について深掘りしていきます。

スポンサーリンク

substringメソッドの概要

substringは、指定した2つのインデックス間の文字列を取得するJavaScriptの標準メソッドです。このメソッドを使えば、文字列の任意の部分を簡単に抽出できます。

substringメソッドの構文

str.substring(indexStart[, indexEnd])
  • indexStart: 部分文字列の抽出を開始する位置を指定。
  • indexEnd (オプショナル): 部分文字列の抽出を終了する位置を指定。この位置自体は含まれません。

重要な特性と挙動

  1. indexStart と indexEnd が同じ場合、結果は空の文字列になります。
  2. indexStart が indexEnd より大きい場合、これらの2つの引数は交換されます。
  3. indexStart や indexEnd が文字列の長さを超えている場合、文字列の長さとして扱われます。
  4. indexStart や indexEnd が負の場合、0として扱われます。

使用例 実際のコード

let str = 'JavaScript';

// indexStart から文字列の最後までを抽出
console.log(str.substring(4)); // 'Script'

// indexStart から indexEnd までを抽出 (indexEndは含まれない)
console.log(str.substring(0, 4)); // 'Java'

// indexStart が indexEnd より大きい場合、2つの引数が交換される
console.log(str.substring(4, 0)); // 'Java'

// 負のインデックスは0として扱われる
console.log(str.substring(-3, 4)); // 'Java'

// インデックスが文字列の長さを超える場合、文字列の長さとして扱われる
console.log(str.substring(4, 20)); // 'Script'

注意 substring vs slice vs substr

  • substringと似ているメソッドにsliceがあります。これらのメソッドは似たような動作をしますが、sliceは負のインデックスも許可して、それを文字列の末尾からのオフセットとして解釈します。
  • また、substrメソッドもありますが、これはECMAScript 2015で非推奨とされ、今後のバージョンで削除される可能性があるので、新しいコードではsubstringまたはsliceを使用することが推奨されています。

よくある質問(FAQ)

Q. substring()とslice()の違いは何ですか?
A. substring()は引数が負の場合0として扱い、引数の大小を自動的に入れ替えます(start > endの場合でも動作します)。slice()は負の値を末尾からのインデックスとして扱い、start > endの場合は空文字を返します。現代ではslice()の方が予測可能な動作で推奨されます。
Q. 文字列の特定位置から特定文字数を取得するにはどうすればよいですか?
A. str.substr(開始位置, 文字数)が直感的ですが、substrはレガシーメソッドで非推奨です。代わりにstr.slice(開始位置, 開始位置 + 文字数)またはstr.substring(開始位置, 開始位置 + 文字数)を使います。
Q. 文字列から特定の単語を抜き出すにはどうすればよいですか?
A. indexOf()で位置を見つけてsliceで切り出します:const start = str.indexOf("keyword"); str.slice(start, start + "keyword".length)。または正規表現のmatch()でキャプチャグループを使う方が柔軟です:str.match(/(keyword)/)?.[1]

まとめ

substringメソッドは、JavaScriptで部分文字列を取得するための非常に便利なメソッドです。シンプルな構文と覚えやすい挙動のため、日常のコーディングにおいて頻繁に利用されます。特に文字列の特定の範囲をクリーンに取得したい場合に、substringメソッドは最適な選択肢の一つと言えるでしょう。