あるプログラミングの現場で、文字列の中に特定の語句が含まれているかどうかをチェックすることはよくある要件です。「JavaScript 文字列 含まれる 判定」というキーワードで検索する方は、どのメソッドを使うべきか、パフォーマンスや互換性、正規表現をどう活かすかなどの情報を求めているはずです。本記事では文字列に特定の文字列が含まれているかを判定するための手法を比較し、使いどころを整理した内容を紹介します。
目次
JavaScript 文字列 含まれる 判定 に使われる代表的なメソッド比較
文字列の「含まれるか」を判定する目的で、よく使われるメソッドには includes、indexOf、search、match などがあります。これらはそれぞれ異なる特徴を持っており、用途や環境によって使い分けが必要です。ここでは各メソッドの動作の概要と特性を比較し、選定の基準を示します。
String.prototype.includes の特徴と使いどころ
includes は引数に指定した部分文字列が対象の文字列中に含まれていれば true、含まれていなければ false を返す最も直感的な方法です。大文字・小文字は区別され、部分文字列が空文字列の場合は常に true を返します。検索開始位置を指定できる第2引数もあり、特定のインデックスから検索を開始したいケースで便利です。このメソッドは ES2015(モダン JavaScript)の一部であり、多くのブラウザや Node 環境でサポートされていますが、古いブラウザ(特に Internet Explorer)には対応していないことがあります。
indexOf を使って判定する方法と特徴
indexOf は部分文字列が見つかった場合はその先頭インデックスを返し、見つからなければ -1 を返します。includes と異なり、戻り値が数値であるため、どこにあるかを取得したい場合に有効です。また、includes に比べて古くから存在するため、古いブラウザの互換性も高いです。一方で、「含まれているかどうか」だけを知りたい目的には、若干冗長に感じることがあります。
正規表現(RegExp)を使った検索手段
pattern に基づく検索が必要な場合や、ワイルドカード的なマッチングをしたい場合には正規表現を用いる search や match や test メソッドが活躍します。たとえば任意の数字3桁かどうかや、「a または b」のような範囲指定などは RegExp と test で柔軟に判定できます。ただし、正規表現の構築ミスやエスケープの問題などで思わぬ動作になることもあり、パフォーマンスへの影響も無視できません。
JavaScript 文字列 含まれる 判定 の具体的な使い方と注意点
実践的なケースで「文字列が含まれるか」を判定する際、メソッド選びだけでなく大文字小文字の扱い、開始位置、複数出現、特殊文字などの注意点があります。ここでは具体例を交えながら、それらの扱い方を整理します。
大文字・小文字を無視した判定方法
includes や indexOf は標準では大文字と小文字を区別します。検索対象や語句をどちらも toLowerCase や toUpperCase で変換することでケースを揃えるか、正規表現でフラグ「i」を使う方法があります。前者は単純で高速、後者は柔軟性が高いものの、正規表現の学習コストやオーバーヘッドがあります。
検索開始位置を指定したいケース
部分文字列が文字列のどこから始まるかを制御したいとき、includes や indexOf の第2引数を指定します。includes(search, position)、indexOf(search, position) により、position インデックス以降にマッチがあるかどうかを判定できます。position が負の値だったり文字列長を越える値だったりすると処理結果に注意が必要です。
複数の出現や位置を取得する必要がある場合の対応
メソッド includes や simple indexOf では「最初の1つ」の判定や位置取得になるので、複数出現を調べたい場合はループで indexOf を繰り返す、正規表現で global フラグを使う、matchAll を使うなどの手段があります。出現回数を数える、全てのマッチ位置を取得するなどの要件があるならこれらの方法が適しています。
パフォーマンスと互換性の観点からの比較
どのメソッドを選ぶかは機能だけでなくパフォーマンスや対応環境にも左右されます。特に大きな文字列や多数の検索を繰り返す場面、古いブラウザへの対応が求められる場面では、メソッドの選定が重要です。ここではそれらの比較を行います。
速度・時間計算量の違い
includes や indexOf は最悪ケースで文字列長 × 探す文字列長に比例する時間がかかるような O(n⋅m) と言われることがあります。ただし実装によっては高速化(例えば部分一致失敗時のジャンプなど)があり、現実の利用では差が小さくなることが多いです。正規表現のパターンによってはより手間がかかるケースもあります。対象文字列が非常に長かったり検索を多数回行うときは、事前にデータ構造を変えるなど最適化も考慮すべきです。
ブラウザ・JavaScript のバージョン対応状況
includes は ES2015 で文字列に導入され、近年のブラウザや Node 環境で広くサポートされています。しかし Internet Explorer など古いブラウザでは使えないため、対応が必要なプロジェクトでは polyfill を用いたり、代替として indexOf を使った条件付き記述にすることが推奨されます。実務ではサポート対象ブラウザを確認し、それに応じてメソッド選択をするようにします。
正規表現利用時の注意点(特殊文字・安全性)
正規表現はメタ文字のエスケープを忘れると予期せぬマッチが起きることがあります。例えばピリオドやバックスラッシュなどを文字として検索したい場合は \ を使ってエスケープする必要があります。また、ユーザー入力をそのまま正規表現として扱うのは安全性の観点からリスクがあるため注意が必要です。入力を正規表現で使う前にサニタイズするか、文字列として扱う方法を検討します。
実践コードパターン:用途別おすすめメソッドとサンプル
ここからは具体的な用途に応じてどのようなコードを書けばよいかを紹介します。典型的なユースケースを想定して、それぞれ最適と思われる方法を実例付きで示します。
単純に含まれるかだけを知りたいとき
文字列に特定の語句が含まれているかだけを判断したい場合は includes を使うのが最も読みやすく推奨されるパターンです。以下はその一例です。
const text = ``ある文字列``;
if (text.includes(`探したい語句`)) {
// 含まれている場合の処理
}
位置も取得したい/最初の場所が必要な場合
文字列がどこにあるかを知る必要がある場合は indexOf が適切です。indexOf は見つからなければ -1 を返すため、条件分岐に使うことができます。サブストリングの開始インデックスを使って後続の処理を行いたいときに重宝します。
複数の候補語句のいずれかが含まれるかを調べたいとき
複数のワードのどれかが含まれているかをチェックするケースでは、配列に語句を入れて some メソッドを使うか、正規表現で OR 条件を作る方法があります。配列 some を使う場合はそれぞれ includes を使って真偽値を組み合わせる形がシンプルです。
大規模な文字列や多数の比較が必要な場合の最適化
対象文字列が非常に長い、または比較対象が多数あるような場面では、検索対象を Set や Map などに変換して高速な一致チェックをするパターンもあります。特に配列の中に多数の単語があり、その中から含まれるかを複数の文書で調べるような場合にはこのような戦略が効果的です。
よくある誤りとトラブルシューティング
「含まれるか」を判定する際によくあるミスや落とし穴を抑えておきましょう。知らずに使うとバグの原因になりますが、意図を明確にすれば回避可能です。
includes の引数に正規表現を渡してしまう誤り
includes の第一引数には文字列を渡す必要があります。正規表現オブジェクトを渡すと TypeError を引き起こすため注意が必要です。正規表現を使う場合は search や test メソッドを使うようにコードを設計しましょう。
indexOf の戻り値の誤用
indexOf は -1 を返すかもしれないということを理解していないと if 文などで誤った判定をしてしまいがちです。例えば if (str.indexOf(s) > 0) と書くと最初の位置が 0 の場合は false になるため、「含まれているが最初に出ている」のケースを見逃します。判定には !== -1 を使う習慣をつけましょう。
特殊文字やエスケープの扱い忘れ
正規表現でピリオドやプラス記号、バックスラッシュなどの特殊な記号を検索語句に含む場合、正しくエスケープしないと意図しないマッチが起きます。ユーザー入力を検索に使う場合は、入力を文字列として処理し、正規表現利用時には安全にエスケープする処理を入れることが望ましいです。
IE や古い環境で includes 非対応のケース
プロジェクトによっては古いブラウザがサポート対象に含まれることがあります。includes が使えない環境では polyfill を導入するか、代替として indexOf を使うコードパスを設けることが安全です。互換性のチェックは導入前に必ず行ってください。
メソッド選びの指針と比較表
どのメソッドを使うか迷ったときの判断基準を整理します。ケースごとのおすすめを示しつつ、比較表で特徴を一目で分かるようにします。
判断基準サマリー
- 含まれているかだけを知りたい → includes を第一選択。
- 位置を取得したい → indexOf を選ぶ。
- 複数の語句、パターンで判定したい → some や正規表現を活用。
- 大文字小文字を無視したい →両方を統一して小文字/大文字化または RegExp によるフラグ操作。
- 古いブラウザの対応が必要かどうかを確認 → includes が非対応の場合は indexOf や polyfill の検討。
| メソッド | 戻り値 | 大文字小文字の扱い | 位置取得 | 互換性 |
|---|---|---|---|---|
| includes | true / false | 区別する | 取得不可 | モダンな多数環境で対応 |
| indexOf | 数値(インデックス)または -1 | 区別する | 取得可能 | ほぼ全ての JS 環境で対応 |
| RegExp / test / search | パターンマッチの真偽値または配列/インデックス | フラグで制御可能 | 取得可能 | 正規表現サポートがあれば利用可能 |
まとめ
文字列に含まれるかどうかを判定したいケースでは、まず何を知りたいかを明確にすることが重要です。含有の有無だけなら includes が最も表現がシンプルで可読性が高いためおすすめです。位置を知りたい場合や古い環境をサポートする必要がある場合は indexOf が適しています。
また、複数候補の語句、(regex)パターンを使いたい、大文字小文字の無視、特殊文字の扱いなど追加要件がある場合には正規表現や文字の変換を活用するのが賢明です。
検索対象文字列が巨大であり頻繁に判定を行うような場面では、データ構造を工夫したり検索回数を減らす工夫をすることでパフォーマンス改善が見込めます。
以上を踏まえて、「JavaScript 文字列 含まれる 判定」というニーズに対しては、目的・環境・要件に応じて includes、indexOf、RegExp 等を適切に使い分けることが、読みやすく保守性の高いコードを書く鍵になります。
コメント