Dartで文字列が含まれるか検索する5つの方法(containsなど)【Flutter対応】

Dartで文字列の中に特定の文字が含まれているかを調べる方法について書いています。
文字列が含まれるか調べる処理が使われるのは、例えば次のようなケースです。

  • 入力フォームのバリデーション
  • 検索機能でキーワード一致を判定したい
  • URL・メールアドレスの簡易チェック
  • APIレスポンスの文字列を解析したい

この記事では、Dartで文字列を検索する基本的な方法を解説します。
※ 載せているコードはFlutter 3.29.3 / Dart 3.7.2で動作を確認しています。

Dartで文字列を検索する基本方法(contains)

最も基本的な文字列検索方法は、String.contains()です。

基本構文

bool result = '検索対象の文字列'.contains('探したい文字');

サンプルコード

void main() {
  String text = 'FlutterとDartを勉強しています';

  if (text.contains('Dart')) {
    print('Dartが含まれています');
  } else {
    print('Dartは含まれていません');
  }
}

text変数に文字列を格納して、次の処理でcontainsメソッドを使用しています。
渡しているのはDartなので、text変数の文字列にDartが含まれるか確認します。

結果、含まれているので「Dartが含まれています」が出力されます。
このようにcontains()は渡した文字列を使用して、部分一致で検索されます。

大文字・小文字を区別せずに検索する方法

containsは文字・小文字を区別します。

'Flutter'.contains('flutter'); // false

上記コードは大文字・小文字を区別するので、falseが返ってきます。
区別せずに検索したい場合は、toLowerCase()(または toUpperCase())を組み合わせます。

サンプルコード

大文字・小文字を区別せずに検索するサンプルです。

String text = 'FlutterとDart';

bool result = text.toLowerCase().contains('flutter');

print(result); // true

text変数に入れた文字列を次の処理でtoLowerCase()を使うことで、英文字を小文字にしています。
そしてcontains()を呼び出して、小文字で検索することで、大文字だった場合でもtrueが返ってきます。

文字列の開始・終了位置を検索する方法

文字列の開始位置(前方一致)・終了位置(後方一致)で検索する方法です。

startsWith(前方一致)

String text = 'Flutterアプリ開発';

print(text.startsWith('Flutter')); // true

文字列の開始位置から検索するにはstartsWith()を使います。
上記の例では開始位置にFlutterがあるのでtrueが返ってきます。

endsWith(後方一致)

String fileName = 'sample.dart';

print(fileName.endsWith('.dart')); // true

文字列の終了位置から検索するにはendsWith()を使います。
上記の例では終了位置に.dartがあるのでtrueが返ってきます。

👉 ファイル名(拡張子)チェックやURL判定でよく使われます。

正規表現を使って文字列を検索する方法

より複雑な検索をしたい場合は、正規表現(RegExp)を使います。

基本例

String text = 'メールアドレスは test@example.com です';

RegExp regExp = RegExp(r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+');

print(regExp.hasMatch(text)); // true

正規表現を指定して、RegExpオブジェクトを作成しています。
RegExpオブジェクトのhasMatch()を呼び出すときに文字列を渡すことで、正規表現の文字列が含まれているか確認しています。

上記の例だと、メールアドレスが含まれているのでtrueが返ってきます。

検索結果を取得する例

下記は含まれる文字列を正規表現で検索して、マッチするものを取得する例です。

RegExp regExp = RegExp(r'\d+');
String text = '注文番号は12345です';

Iterable<Match> matches = regExp.allMatches(text);

for (var match in matches) {
  print(match.group(0)); // 12345
}

RegExpを使用して、連続する数値を正規表現で指定しています。
regExp.allMatches(text)で、渡したtext文字列の中に含まれる連続する数値を全て取得しています。

取得した内容がmatchesに格納されています。
最後にループでひとつずつ出力しています。今回は1つだけなので、1個だけ出力されます。

Flutterでの実用例(TextField入力チェック)

Flutterでは、ユーザー入力文字列の検索がよく行われます。

入力文字に「@」が含まれているかチェック

TextField(
  onChanged: (value) {
    if (value.contains('@')) {
      print('メールアドレス形式っぽいです');
    }
  },
)

上記はテキストフィールドの文字列が変更されたとき(onChange)に「@」が含まれていたら「メールアドレス形式っぽいです」と出力しています。
このようにcontainsなどの文字列検索関数は、フォームのバリデーションやリアルタイムチェックに便利です。

Dartの文字列検索でよくある注意点

null安全(Null Safety)

Stringオブジェクトがnullも設定できる場合は、チェックしておかないとエラーになります。

String? text;

// text.contains('a'); // エラー

if (text != null && text.contains('a')) {
  print('aが含まれています');
}

空文字の場合

''.contains('a'); // false

空文字に文字列を含むか検索した場合は、エラーにはなりません。
空文字以外を指定するとfalseが返ってきます。

Dartで使える文字列検索方法まとめ

方法 用途
contains 部分一致検索
startsWith 前方一致
endsWith 後方一致
RegExp 複雑な条件検索
toLowerCase + contains 大文字・小文字を無視

まとめ

今回はDart / Flutterで、文字列の中に特定の文字列が含まれるか判定する方法について確認しました。

まとめると、下記のようになります。

  • Dartの文字列検索は contains() が基本
  • 大文字・小文字を無視したい場合は toLowerCase() を使う
  • Flutterでは入力チェックや検索機能で頻繁に使われる
  • 正規表現を使えば柔軟な検索が可能

Dart / Flutterを使ったアプリ開発では必須の知識なので、ぜひ覚えておきましょう。

コメント