JavaScriptにおける文字列検索は、Webアプリケーション開発において最も頻繁に行われる操作の一つです。
2026年現在、JavaScriptの標準仕様であるECMAScriptの進化により、文字列検索には多様なメソッドが用意されています。
単純なキーワードの存在確認から、正規表現を用いた高度なパターンマッチングまで、目的に応じた最適な選択が求められます。
本記事では、現代のフロントエンド・バックエンド開発で必須となる文字列検索メソッドを網羅し、その使い分けを詳細に解説します。
パフォーマンスの観点や最新のUnicode対応についても触れていきますので、ぜひ日々のコーディングの参考にしてください。
JavaScriptで利用できる主要な文字列検索メソッド一覧
JavaScriptのStringオブジェクトには、特定の文字列が含まれているかを判定するためのメソッドが複数定義されています。
まずは、どのようなメソッドが存在し、それぞれがどのような役割を持っているのかを俯瞰してみましょう。
| メソッド名 | 返り値 | 主な用途 |
|---|---|---|
includes() | boolean | 特定の文字列が含まれているかの単純確認 |
startsWith() | boolean | 文字列が特定のフレーズで始まっているかの確認 |
endsWith() | boolean | 文字列が特定のフレーズで終わっているかの確認 |
indexOf() | number | 最初に見つかった位置のインデックスを取得(存在しない場合は-1) |
lastIndexOf() | number | 最後に見つかった位置のインデックスを取得(存在しない場合は-1) |
search() | number | 正規表現を用いた検索と位置の取得 |
match() | Array | null | 正規表現に一致した部分の情報を配列で取得 |
matchAll() | Iterator | 正規表現に一致したすべての詳細情報を反復子で取得 |
これらのメソッドを適切に使い分けることで、コードの可読性が向上し、意図しないバグを未然に防ぐことが可能になります。
真偽値で判定する:includes, startsWith, endsWith
2026年の開発現場において、最も頻繁に使用されるのが真偽値を返すメソッド群です。
これらは「値が存在するかどうか」という条件分岐に特化しており、直感的で読みやすいコードを書くのに適しています。
includesメソッドによる部分一致の確認
includes()メソッドは、文字列の中に指定したキーワードが含まれているかを判定します。
大文字と小文字を区別するため、検索前に正規化を行うことも検討すべきです。
const message = "JavaScriptは2026年も進化を続けています。";
const keyword = "進化";
// 部分一致の確認
if (message.includes(keyword)) {
console.log(`「${keyword}」が見つかりました。`);
}
「進化」が見つかりました。
startsWithとendsWithによる位置指定の検索
特定のプレフィックスやサフィックスを確認したい場合には、startsWith()やendsWith()が最適です。
例えば、URLが「https」で始まっているか、ファイル名が「.pdf」で終わっているかといった判定に重宝します。
const fileName = "report_2026.pdf";
console.log(fileName.startsWith("report")); // true
console.log(fileName.endsWith(".pdf")); // true
true
true
位置(インデックス)を取得する:indexOf, lastIndexOf
「検索キーワードが何文字目にあるか」を知る必要がある場合には、インデックスを返すメソッドを使用します。
includes()が登場する以前は、これらが存在確認の代用として使われてきました。
indexOfメソッドの基本と注意点
indexOf()は、指定した文字列が最初に出現する位置を数値で返します。
見つからなかった場合は「-1」を返すという仕様に注意が必要です。
const text = "Apple, Banana, Orange, Banana";
const target = "Banana";
const firstIndex = text.indexOf(target);
console.log(`最初の位置: ${firstIndex}`);
最初の位置: 7
条件分岐で利用する場合、if (text.indexOf(target))と書くと、位置が「0」の場合にJavaScriptの「Falsy」な性質により偽と判定されてしまいます。
そのため、必ずif (text.indexOf(target) !== -1)と記述しなければなりません。
lastIndexOfによる後方検索
lastIndexOf()は、文字列を後ろから検索し、最初に見つかった(全体としては最後の)位置を返します。
const text = "Apple, Banana, Orange, Banana";
const lastIndex = text.lastIndexOf("Banana");
console.log(`最後の位置: ${lastIndex}`);
最後の位置: 23
正規表現による高度な検索:search, match, matchAll
単純な文字列一致ではなく、複雑なパターン(電話番号、メールアドレス、特定の命名規則など)を検索する場合には正規表現が必須となります。
searchメソッドによるパターン検索
search()メソッドは、正規表現を受け取り、最初にマッチした位置を返します。
indexOf()と似ていますが、正規表現が使える点が大きな違いです。
const log = "ERROR: 2026-05-20: システム異常を検知しました。";
// 数字4桁-数字2桁-数字2桁のパターンを検索
const dateIndex = log.search(/\d{4}-\d{2}-\d{2}/);
console.log(`日付の開始位置: ${dateIndex}`);
日付の開始位置: 7
matchとmatchAllによる詳細情報の抽出
単なる位置だけでなく、マッチした具体的な文字列やキャプチャグループを取得したい場合はmatch()を使用します。
また、「すべての該当箇所」を詳細に取得したい場合はES2020で導入されたmatchAll()が最適です。
const tags = "tag:JavaScript, tag:NodeJS, tag:Web";
const regex = /tag:([a-zA-Z]+)/g;
// matchAllは反復子を返す
const matches = tags.matchAll(regex);
for (const match of matches) {
console.log(`見つかったタグ: ${match[1]} (フルマッチ: ${match[0]})`);
}
見つかったタグ: JavaScript (フルマッチ: tag:JavaScript)
見つかったタグ: NodeJS (フルマッチ: tag:NodeJS)
見つかったタグ: Web (フルマッチ: tag:Web)
matchAll()を使用することで、各マッチに対するキャプチャグループの情報を簡単に処理できるようになりました。
2026年における用途別の使い分けガイド
多くのメソッドが存在するため、どの場面でどれを使うべきか迷うことがあるかもしれません。
ここでは、実務でよく遭遇するケースに応じた最適なメソッドの選び方を整理します。
単純な存在チェックを行う場合
includes() を最優先で使用してください。
コードが最も短くなり、第三者が読んだ際にも「存在を確認している」という意図が瞬時に伝わります。
特定の位置で始まっているか、終わっているかを確認する場合
startsWith() または endsWith() を使用してください。
slice()などで文字列を切り出してから比較するよりも、計算効率が良く直感的です。
複雑なパターンに一致するか確認する場合
正規表現の test() メソッド、または文字列の search() を検討してください。
ただし、位置情報が不要な場合は RegExp.prototype.test() の方がパフォーマンスに優れる傾向があります。
一致した部分をすべて取得・加工したい場合
matchAll() を使用してください。
従来の match() にグローバルフラグ(g)を付けた場合、キャプチャグループの情報が取得できないという欠点がありましたが、matchAll() はその問題を解消しています。
パフォーマンス比較:どの検索方法が速いのか
大量のデータを処理する場合、メソッドの選択がアプリケーションの応答速度に影響を与える可能性があります。
2026年現在の一般的なJavaScriptエンジン(V8など)における傾向を確認しましょう。
固定文字列の検索スピード
固定文字列を検索する場合、includes() と indexOf() はほぼ同等の最速クラスです。
これらは内部的に最適化されており、単純なループ処理よりも高速に動作するように設計されています。
正規表現 vs 文字列メソッド
正規表現を用いた検索は、パターン解析のオーバーヘッドがあるため、固定文字列の検索に比べると低速です。
そのため、/keyword/.test(str) とするよりも、可能であれば str.includes("keyword") を選択するほうがCPUリソースを節約できます。
しかし、現代のブラウザやNode.js環境では、数千回程度の実行であればその差は体感できるほどではありません。
Unicodeとサロゲートペアへの対応
2026年のWeb開発では、絵文字や特殊な多言語文字を扱う機会が増えています。
JavaScriptの length プロパティや indexOf は「16ビット単位(コードユニット)」で位置を計算します。
サロゲートペア(絵文字など)が含まれる文字列を正確に検索・分割する場合、最新の v フラグを用いた正規表現や、Intl.Segmenter の活用を検討する必要があります。
// 2026年推奨の高度な正規表現(vフラグ)
const emojiText = "JavaScript is 🔥!";
const regex = /\p{Emoji}/v;
console.log(emojiText.search(regex)); // 絵文字の正しい位置を取得
14
このように、Unicodeプロパティをサポートした正規表現を利用することで、多言語対応の精度を高めることが可能です。
実践:大規模テキストからの高速検索アルゴリズム
巨大なテキストデータ(ログファイルや数万行のJSONなど)から特定のキーワードを高速に検索する場合、単一のメソッド呼び出しだけでは不十分な場合があります。
検索を効率化するためのいくつかのテクニックを紹介します。
Web Workerの活用
メインスレッドで重い検索処理を行うと、ユーザーインターフェースがフリーズしてしまいます。
大規模な検索は Web Worker にオフロードし、バックグラウンドで実行させるのが2026年のスタンダードな手法です。
インデックスの事前構築
何度も同じデータに対して検索を行う場合は、事前にデータを「単語」ごとに分解して Map オブジェクトなどに保持しておく「転置インデックス」の手法が有効です。
これにより、検索時の計算量を O(N) から O(1) に近づけることができます。
まとめ
JavaScriptで文字列を検索する方法は多岐にわたりますが、基本的には「何を返してほしいか」でメソッドを選択するのが正解です。
真偽値が必要なら includes、位置が必要なら indexOf、複雑な条件なら matchAll という具合に使い分けましょう。
また、2026年という時代背景において、絵文字や多言語を考慮したUnicode対応の重要性はますます高まっています。
コードの可読性、保守性、そしてパフォーマンスのバランスを考えながら、最適なメソッドを使いこなしてください。
この記事で紹介したテクニックを活用し、より堅牢で効率的なJavaScriptコードの実装を目指しましょう。
