【2026年8月最新】Javaのcontainsで文字列を含むか判定する方法完全ガイド|使い方とClaude Code活用術
Javaで「ある文字列の中に、特定のキーワードが含まれているかどうか」を判定したいとき、最もよく使われるのがString.contains()メソッドです。会員番号の前方一致チェック、ログファイルからのエラー検索、顧客名簿の部分一致検索など、実務のあらゆる場面で登場する基本メソッドです。
この記事では、containsの基本構文から、大文字小文字を無視した判定方法、indexOf・startsWith・matchesといった似たメソッドとの使い分け、NullPointerException対策、複数キーワードを一括判定する実装パターンまでを、コード付きで整理します。
さらに後半では、「文字列に何かが含まれているかを判定する」というロジックが、実は日々の業務における「条件に合うデータを探し出す」という作業と本質的に同じだという視点から、非エンジニアの経営者がこうしたコードの意味を理解する意義と、Claude Codeでの業務自動化への活かし方を、弊社(株式会社GENAI)の実例とともに紹介します。
📚 用語解説
String(文字列型):Javaにおいて、文字の並び(テキスト)を表すデータ型。"こんにちは"や"user@example.com"のような値がStringにあたる。containsやindexOf、startsWithなど、文字列を検索・比較・加工するための多数のメソッドが用意されています。
この記事を最後まで読むと、次の6つが明確になります。
01 BASIC USAGE String.containsの基本構文と使い方 文字列に特定の文字列が含まれているかを判定する
String.contains()は、ある文字列の中に、指定した文字列が含まれているかどうかをtrue/falseで返すメソッドです。文字列の一部が一致していれば十分で、完全一致である必要はありません。
// 基本構文
String text = "株式会社GENAIはAI業務自動化を支援しています";
boolean result1 = text.contains("GENAI"); // true
boolean result2 = text.contains("業務自動化"); // true
boolean result3 = text.contains("マーケティング"); // false
System.out.println(result1); // true
System.out.println(result2); // true
System.out.println(result3); // false
// 空文字は必ずtrueになる(すべての文字列は空文字を含む)
System.out.println(text.contains("")); // true
// containsは大文字小文字を区別する
String email = "Contact@genai-ai.co.jp";
System.out.println(email.contains("contact")); // false(小文字とは一致しない)
System.out.println(email.contains("Contact")); // true
containsメソッドの戻り値はboolean(true/false)なので、if文の条件式にそのまま使えるのが特徴です。文字列比較の中では最もシンプルで直感的なメソッドの一つと言えます。
引数に渡す検索対象の文字列は、変数でも直接の文字列リテラルでも構いません。実務では、ユーザーが検索フォームに入力した値や、設定ファイルから読み込んだキーワードリストを変数として渡すケースがほとんどです。
📚 用語解説
メソッド:あるオブジェクト(この記事ではString=文字列)に対して呼び出せる「機能」のこと。text.contains("GENAI")のように、対象となる変数の後ろに「.メソッド名(引数)」という形で呼び出します。containsは「含まれているか」を判定するメソッドの代表例です。
1-1. containsが実務でよく使われる場面
containsは非常にシンプルなメソッドですが、実務での利用頻度は極めて高い機能です。代表的な利用シーンを整理すると、以下のようなものが挙げられます。
こうした「大量のデータの中から、条件に合うものだけを絞り込む」という作業は、業務システムの検索機能・フィルタリング機能の裏側で必ずと言っていいほど使われている処理です。
02 CASE INSENSITIVE 大文字小文字を無視して判定する方法 containsは大文字小文字を区別するため、一工夫が必要
前章で触れた通り、containsは大文字小文字を区別します。「ユーザーが検索欄に入力した文字列」のように、大文字・小文字を区別せず判定したい場面では、両方の文字列を小文字(または大文字)に揃えてから比較する方法が一般的です。
// 大文字小文字を無視して判定する方法 String text = "Welcome to GENAI Blog"; String keyword = "genai"; // 方法1: toLowerCase()で両方を小文字に揃える(最も一般的) boolean result1 = text.toLowerCase().contains(keyword.toLowerCase()); System.out.println(result1); // true // 方法2: 正規表現(Pattern)を使う方法 import java.util.regex.Pattern; Pattern pattern = Pattern.compile(Pattern.quote(keyword), Pattern.CASE_INSENSITIVE); boolean result2 = pattern.matcher(text).find(); System.out.println(result2); // true // 方法3: Apache Commons LangのcontainsIgnoreCase(外部ライブラリ利用時) // import org.apache.commons.lang3.StringUtils; // boolean result3 = StringUtils.containsIgnoreCase(text, keyword);
正規表現(Pattern)は特殊文字のエスケープが必要になるなど扱いがやや複雑です。単純な大文字小文字無視の判定であれば、toLowerCase()で揃える方法が最もシンプルでバグも少なく、実務での採用例が最も多い方法です。
03 RELATED METHODS indexOf・startsWith・matchesとの使い分け 「含むかどうか」を調べる方法は複数ある
Javaには文字列の中身を調べるメソッドが複数あり、目的によって使い分ける必要があります。
| メソッド | 戻り値 | 用途 | 使用例 |
|---|---|---|---|
| contains() | boolean | 文字列に含まれているかだけ知りたい | text.contains("keyword") |
| indexOf() | int(位置、なければ-1) | 含まれているかに加えて、位置も知りたい | text.indexOf("keyword") |
| startsWith() | boolean | 文字列の先頭が一致するか調べたい | text.startsWith("Mr.") |
| endsWith() | boolean | 文字列の末尾が一致するか調べたい | text.endsWith(".pdf") |
| matches() | boolean | 正規表現パターンに一致するか調べたい | text.matches("[0-9]{3}-[0-9]{4}") |
String filename = "invoice_2026_08.pdf";
// contains: 「含まれているか」だけ
System.out.println(filename.contains("2026")); // true
// indexOf: 「どこにあるか」まで分かる
int pos = filename.indexOf("2026");
System.out.println(pos); // 8(0始まりで9文字目から一致)
System.out.println(filename.indexOf("2027")); // -1(見つからない)
// startsWith: 先頭一致(ファイル種別の判定などに便利)
System.out.println(filename.startsWith("invoice_")); // true
System.out.println(filename.startsWith("receipt_")); // false
// endsWith: 末尾一致(拡張子チェックの定番)
System.out.println(filename.endsWith(".pdf")); // true
System.out.println(filename.endsWith(".xlsx")); // false
// matches: 正規表現によるパターン一致(郵便番号の形式チェック等)
String zipCode = "123-4567";
System.out.println(zipCode.matches("[0-9]{3}-[0-9]{4}")); // true
📚 用語解説
正規表現(Regular Expression):文字列のパターンを表現するための特殊な記法。「数字3桁-数字4桁」のような形式的なルールを表現でき、郵便番号・電話番号・メールアドレスの形式チェックなどに使われます。containsのような単純な部分一致では表現できない、複雑なパターン判定に向いています。
迷ったときの判断基準はシンプルです。「含まれているかどうかだけで良い」ならcontains、「位置も欲しい」ならindexOf、「先頭・末尾だけ」ならstartsWith/endsWith、「形式(パターン)をチェックしたい」ならmatchesを選びます。
だけ知りたい
contains()
知りたい
indexOf()
だけ調べたい
startsWith/endsWith
チェックしたい
matches()
04 NULL SAFETY containsでNullPointerExceptionが起きるケースと対策 nullの文字列にcontainsを呼ぶと実行時エラーになる
text変数がnullの状態でtext.contains("keyword")を実行すると、NullPointerException(NPE)が発生してプログラムが異常終了します。ユーザー入力やデータベースから取得した値をcontainsで判定する場合、nullが混入する可能性を必ず考慮する必要があります。
// NullPointerExceptionが起きるパターン
String text = null;
// System.out.println(text.contains("keyword")); // NullPointerException!
// === 対策1: nullチェックを先に行う ===
if (text != null && text.contains("keyword")) {
System.out.println("含まれている");
} else {
System.out.println("含まれていない、またはnull");
}
// === 対策2: Objects.requireNonNullElse で代替値を用意 ===
import java.util.Objects;
String safeText = Objects.requireNonNullElse(text, "");
System.out.println(safeText.contains("keyword")); // false(例外なし)
// === 対策3: Optionalでnullを明示的に扱う ===
import java.util.Optional;
boolean result = Optional.ofNullable(text)
.map(t -> t.contains("keyword"))
.orElse(false);
System.out.println(result); // false(例外なし)
// === 逆に「検索キーワード側」がnullの場合 ===
String keyword = null;
String content = "サンプルテキスト";
// content.contains(keyword); // こちらもNullPointerException!
if (keyword != null) {
System.out.println(content.contains(keyword));
}
実務では特に、データベースやAPIから取得した値、フォームの入力値をcontainsで判定する際にnullが紛れ込みやすくなります。「動いていたコードが、特定のデータのときだけエラーになる」という不具合の多くは、このnullチェック漏れが原因です。
📚 用語解説
NullPointerException(NPE):Javaのプログラムが実行時に「存在しないもの(null)」に対して操作をしようとしたときに発生するエラー。文字列がnullの状態でcontainsのようなメソッドを呼び出すと発生します。Java開発で最も遭遇頻度の高いエラーの一つとされ、事前のnullチェックが対策の基本です。
05 MULTIPLE KEYWORDS 複数キーワードを一括判定する実装パターン AND条件・OR条件で複数のキーワードをまとめて調べる
実務では「複数のキーワードのうち、いずれかが含まれているか(OR)」「すべてのキーワードが含まれているか(AND)」を判定したい場面がよくあります。それぞれの実装パターンを見ていきましょう。
import java.util.List; import java.util.Arrays; String text = "AI業務自動化ツールで、経理・営業・広告を効率化"; // === OR条件: いずれかのキーワードが含まれていればtrue === ListorKeywords = Arrays.asList("経理", "人事", "総務"); boolean containsAny = orKeywords.stream().anyMatch(text::contains); System.out.println(containsAny); // true("経理"が含まれる) // === AND条件: すべてのキーワードが含まれていればtrue === List andKeywords = Arrays.asList("AI", "経理", "営業"); boolean containsAll = andKeywords.stream().allMatch(text::contains); System.out.println(containsAll); // true(すべて含まれる) // === 従来のfor文での実装(Stream APIを使わない書き方) === boolean containsAnyLegacy = false; for (String kw : orKeywords) { if (text.contains(kw)) { containsAnyLegacy = true; break; } } System.out.println(containsAnyLegacy); // true // === 実務例: NGワードフィルタリング === List ngWords = Arrays.asList("暴力", "詐欺", "違法"); String userComment = "この商品は本当に良かったです"; boolean hasNgWord = ngWords.stream().anyMatch(userComment::contains); System.out.println(hasNgWord); // false(NGワードなし=投稿OK)
判定したい文字列
(例:コメント本文)
NGワード・検索語
のリスト
OR/AND条件で
一括判定
判定結果に応じて
処理を分岐
5-1. Stream APIを使うメリット
anyMatch・allMatchのようなStream API(Java8以降で追加された機能)を使うと、従来のfor文を使ったループ処理よりも「何をしたいか」がコードから読み取りやすくなるというメリットがあります。「リストの要素のうち、いずれかが条件を満たすか」という処理の意図が、メソッド名からそのまま伝わるためです。
非エンジニアの方がコードを直接読む機会は少ないかもしれませんが、Claude Codeが生成したコードにanyMatchやallMatchという単語が出てきたら、「複数の条件のどれか、またはすべてに一致するか判定している」という意味だと推測できるだけでも、AIとのやり取りがスムーズになります。
06 WHY IT MATTERS 【独自】非エンジニアが文字列検索ロジックを理解する意味 「containsのようなコード」は、実は日常業務の思考そのもの
ここまで紹介したcontainsのコードを見て、「自分には関係ない専門知識」と感じた方も多いかもしれません。しかし実は、containsが行っている判定の構造は、日々の業務判断とほとんど同じです。
| containsが行う処理 | 業務での同様の判断 |
|---|---|
| テキストにキーワードが含まれるか判定 | 問い合わせ内容にクレームのキーワードが含まれるか確認 |
| 複数キーワードのOR判定 | 対象業種リストのいずれかに該当するか確認 |
| 複数キーワードのAND判定 | すべての契約条件を満たしているか確認 |
| 大文字小文字を無視した判定 | 表記ゆれ(全角/半角、ひらがな/カタカナ)を許容した検索 |
つまり、「ある条件に合致するデータを見つけ出す」という業務上のニーズを、Javaというプログラミング言語で表現したものが、containsをはじめとする文字列検索のメソッド群だと言えます。この構造を理解しておくと、AIエージェントに業務を依頼する際の指示の解像度が格段に上がります。
📚 用語解説
Claude Code:Anthropic社が提供するAIエージェント。「この一覧の中から、特定のキーワードを含む行だけを抽出して」「NGワードが含まれるコメントを自動的にフラグ付けして」といった日本語の指示だけで、containsのようなロジックを組み込んだプログラムを自動生成・実行してくれます。
6-1. 「業務のルール」を言語化できれば、AIがコードに変換してくれる
経営者・管理職が持っている「この条件に当てはまるものは要注意」「このキーワードが入っていたら優先対応」といった業務上の判断基準は、そのままAIへの指示として活用できます。「キーワードを含むかどうかで振り分ける」というロジックの存在を知っているだけで、AIに何を任せられるかのアイデアが広がります。
6-2. あいまいな指示と、具体的な指示の違い
例えば「問い合わせメールを整理して」というあいまいな指示より、「件名または本文に『至急』『クレーム』『返金』のいずれかが含まれるメールに優先フラグを立てて、それ以外は通常フォルダに振り分けて」という具体的な指示の方が、AIエージェントは狙い通りの結果を出しやすくなります。
この「条件を明確に言葉にする」練習として、containsの考え方(何を含んでいたら、どう扱うか)を知っておくことは、AIへの指示の質を底上げする地味ながら効果的な視点です。
07 GENAI CASE DATA 【独自データ】GENAIでのキーワード判定ロジック活用事例 文字列検索の考え方を業務自動化にどう組み込んでいるか
弊社(株式会社GENAI)では、Claude Codeを使った業務自動化の中で、containsに代表される「条件に合致するデータを見つけ出す」ロジックを、さまざまな業務で活用しています。
| 業務領域 | 活用しているロジック | 効果 |
|---|---|---|
| 顧客対応 | メール本文にクレーム関連キーワードが含まれるか自動判定 | 優先対応が必要なメールを自動でフラグ付け |
| ブログ運用 | 記事タイトルの重複キーワードを自動チェック | カニバリゼーション(内容の重複)を事前に検知 |
| 経理 | 請求書データに特定の取引先名が含まれるか判定 | 仕訳の自動分類をサポート |
| 広告運用 | 広告文にNGワードが含まれていないか自動チェック | 審査落ちリスクを事前に低減 |
上記は弊社の実運用に基づく活用事例であり、削減時間などの効果は業種・業態・データ量によって変動します。あくまで参考情報としてご覧ください。
特に印象的だったのは、ブログ記事の重複キーワードチェックの事例です。以前は担当者が過去記事のタイトル一覧を目視で確認していましたが、Claude Codeに「新しい記事タイトルと似た内容の既存記事がないか、キーワードの重複を確認して」と依頼するだけで、数百本規模の記事リストから瞬時に候補を洗い出せるようになりました。人手では数時間かかっていた作業が、数分で完了しています。
08 CONCLUSION まとめ ── containsの仕組みを知ると、AIへの指示も変わる 文字列検索の基礎知識が、業務自動化のアイデアにつながる
この記事では、JavaのString.contains()の基本構文、大文字小文字を無視した判定方法、indexOf・startsWith・matchesとの使い分け、NullPointerException対策、複数キーワードの一括判定、そして非エンジニアがこのロジックを理解する意味までを整理しました。最後にポイントを振り返ります。
containsのようなコードを自分で書けるようになる必要はありません。ただ、「AIが何をしているか」の輪郭を掴んでおくことは、AIエージェントに業務を任せる際の指示の質を大きく左右します。この記事で紹介した考え方を、ぜひ自社の業務の棚卸しにも活かしてみてください。
今日からできる小さな一歩として、自社の業務の中で「これとこれに当てはまるものを、いつも手作業で探している」という作業を1つ思い浮かべてみてください。それこそが、containsに代表される文字列検索ロジックをAIに任せられる、最初の候補になります。
「条件に合うデータを見つけ出す」業務、AIに任せてみませんか
containsが行っているのは、業務でいう「該当するものを見つけ出す」作業と同じです。
その発想を、貴社の業務効率化にどう活かせるか一緒に整理します。
ここから先の進め方は、大きく2つあります。
自社で回せるようになりたい方は、AI鬼管理でClaude Code/Codexの使い方から業務設計・社内定着まで伴走を受けながら、社内に仕組みを作る道があります。
覚えるより任せたい方は、AIBPO by AI鬼管理でこの記事のような定型業務を丸ごと預ける道があります。総額はいまの業務コストの70〜80%が目安、月額基本料は0円です。
どちらが合うかは、業務量と社内体制次第です。無料相談・無料適合診断で、貴社の場合はどちらが向くかからご相談いただけます。
NEXT STEP
この記事の内容を、あなたのビジネスで
実践してみませんか?
よくある質問
Q. String.containsで大文字小文字を区別せずに判定するにはどうすればいいですか?
A. 判定対象の文字列とキーワードの両方をtoLowerCase()(またはtoUpperCase())で揃えてから比較するのが最も一般的な方法です。text.toLowerCase().contains(keyword.toLowerCase())のように書くことで、大文字小文字を無視した判定ができます。
Q. containsとindexOfはどちらを使うべきですか?
A. 「含まれているかどうか」だけを知りたい場合はcontains、「どの位置に含まれているか」まで知りたい場合はindexOfを使います。containsは内部的にindexOfを利用しており、戻り値が-1でないかどうかで判定しています。
Q. JavaのcontainsでNullPointerExceptionを防ぐにはどうすればいいですか?
A. contains()を呼び出す前に、対象の文字列がnullでないかを確認するのが基本です。if (text != null && text.contains("keyword"))のように書くか、Optional.ofNullable()を使ってnullを明示的にハンドリングする方法もあります。
Q. 複数のキーワードのうち、いずれかが含まれるかを判定するにはどうすればいいですか?
A. List.stream().anyMatch(text::contains)を使うと簡潔に実装できます。すべてのキーワードが含まれているかを判定したい場合はallMatchを使います。
Q. プログラミング未経験ですが、このようなコードの内容を理解する必要はありますか?
A. 自分でコードを書けるようになる必要はありません。ただし「文字列に何かが含まれているかを判定する」という考え方を知っておくと、Claude CodeのようなAIエージェントに業務を依頼する際、より具体的で精度の高い指示が出せるようになります。
Q. Claude Codeにcontainsのようなロジックを実装してもらうことはできますか?
A. できます。「この一覧からキーワードを含む行だけを抽出して」「NGワードが含まれるコメントにフラグを立てて」といった日本語の指示だけで、Claude Codeが適切なコードを生成し、実行まで行ってくれます。プログラミングの文法を覚える必要はありません。
Claude Codeで業務自動化を90日で叩き込む
経営者向けの伴走型パーソナルトレーニング
AI鬼管理へのお問い合わせ
この記事を読んで気になった方へ。
AI鬼管理の専門スタッフが、御社に最適な
業務自動化プランを無料でご提案します。




