JavaScript 速習チュートリアル

JavaScript 文字列検索

JavaScript には、文字列の中から特定のテキストを探し出すための多様なメソッドが用意されています。用途に応じて、単純なインデックス取得から正規表現を用いた高度なパターンマッチングまで使い分けることが重要です。

1. JavaScript indexOf()

indexOf() メソッドは、文字列内で指定したテキストが最初に現れる位置のインデックス(ポジション)を返します。テキストが見つからない場合は -1 を返します。

1.1 基本的な例

let text = "Please locate where 'locate' occurs!";
let index = text.indexOf("locate");

JavaScript ではポジションを 0 からカウントします。
0 は 1 番目の文字、1 は 2 番目、2 は 3 番目の文字を指します。

2. JavaScript lastIndexOf()

lastIndexOf() メソッドは、文字列内で指定したテキストが最後に現れる位置のインデックスを返します。

2.1 実装例

let text = "Please locate where 'locate' occurs!";
let index = text.lastIndexOf("locate");

indexOf()lastIndexOf() は、どちらもテキストが見つからない場合に -1 を返します。

2.2 第 2 引数による開始位置の指定

どちらのメソッドも、検索の開始位置として第 2 パラメータを受け取ることができます。

let text = "Please locate where 'locate' occurs!";
let index = text.indexOf("locate", 15);

lastIndexOf() の場合、第 2 パラメータを指定すると後方から前方に向かって検索します。例えば 15 を指定した場合、ポジション 15 から文字列の先頭に向かって検索が行われます。

let text = "Please locate where 'locate' occurs!";
text.lastIndexOf("locate", 15);

3. JavaScript search()

search() メソッドは、指定した値(文字列または正規表現)に一致する部分を検索し、そのポジションを返します。

3.1 実装例

let text = "Please locate where 'locate' occurs!";
text.search("locate"); // 文字列による検索

text.search(/locate/); // 正規表現による検索

3.2 indexOf() と search() の違い

一見、この 2 つのメソッドは同じように見えますが、以下の違いがあります。

  • search() メソッドは、第 2 引数(開始位置)を取ることができません。
  • indexOf() メソッドは、正規表現(Regular Expressions)を用いた柔軟な検索ができません。

4. JavaScript match()

match() メソッドは、文字列を文字列または正規表現と照合した結果を含む配列を返します。

4.1 正規表現フラグによる挙動の違い

let text = "The rain in SPAIN stays mainly in the plain";

// "ain" を検索
text.match("ain");

// 正規表現で "ain" を検索
text.match(/ain/);

// グローバル検索(すべての該当箇所を抽出)
text.match(/ain/g);

// グローバルかつ大文字・小文字を区別せずに検索
text.match(/ain/gi);

正規表現に g モディファイア(グローバル検索)が含まれていない場合、match() は文字列内の最初の一次一致のみを返します。

5. JavaScript matchAll()

matchAll() メソッドは、文字列を文字列または正規表現と照合した結果のイテレータ(Iterator)を返します。

5.1 実装例

// 文字列による検索
const iterator = text.matchAll("Cats");

// 正規表現による検索
const iterator = text.matchAll(/Cats/g);

パラメータが正規表現の場合、グローバルフラグ(g)*が設定されている必要があります。設定されていない場合は TypeError がスローされます。

  • 大文字・小文字を区別しない場合は i フラグを追加します (/Cats/gi)。
  • matchAll() は ES2020 で導入された機能であり、Internet Explorer では動作しません。

6. JavaScript includes()

includes() メソッドは、文字列に指定した値が含まれている場合に true を返し、そうでない場合に false を返します。

6.1 実装例

let text = "Hello world, welcome to the universe.";

// "world" が含まれているか確認
text.includes("world"); // true

// ポジション 12 から検索を開始
text.includes("world", 12); // false
  • このメソッドはケースセンシティブ(大文字・小文字を区別)です。
  • includes() は ES6 の機能です。

7. JavaScript startsWith()

startsWith() メソッドは、文字列が指定した値で始まっている場合に true を返し、そうでなければ false を返します。

7.1 実装例

let text = "Hello world, welcome to the universe.";

text.startsWith("Hello"); // true
text.startsWith("world"); // false

// 検索開始位置を指定(ポジション 6 から "world" で始まるか)
text.startsWith("world", 6); // true
  • ケースセンシティブです。
  • startsWith() は ES6 の機能です。

8. JavaScript endsWith()

endsWith() メソッドは、文字列が指定した値で終わっている場合に true を返し、そうでなければ false を返します。

8.1 実装例

let text = "John Doe";
text.endsWith("Doe"); // true

let text2 = "Hello world, welcome to the universe.";
// 最初の 11 文字が "world" で終わっているかを確認
text2.endsWith("world", 11); // true
  • ケースセンシティブです。
  • endsWith() は ES6 の機能です。

どのメソッドを選択するかは、単なる存在確認なのか (includes)、位置が必要なのか (indexOf)、あるいは複雑なパターン抽出が必要なのか (matchAll) によって決まります。モダンな開発では includesstartsWith を活用してコードの可読性を高めるのがベストプラクティスです。