[Dart / Flutter]文字列の検索 indexOf() , lastIndexOf()

文字列の中から特定の部分文字列の位置を探すときはindexOflastIndexOfを利用します。

文法・構文形式

int str.indexOf(pattern, [int start]) 最初に出現する位置を返す

int str.lastIndexOf(pattern, [int start]) 最後に出現する位置を返す

  • str: 検索対象となる文字列。
  • pattern: 検索したい部分文字列やパターン。
  • start (オプション): 検索を開始する位置。省略時は0で文字列の先頭から開始。

indexOfは、指定したpatternが文字列strの中で最初に現れる位置、1から数えたインデックスを返します。一方、lastIndexOf最後に現れる位置のインデックスを返します。一致する部分文字列が存在しない場合、両方のメソッドは-1を返します。

利用場面

  1. テキストの中からキーワードが最初に出現する場所を知りたい時。
  2. ファイルの拡張子やURLの末尾のパラメーターを見つけたい時。

基本的な使用方法

「Dart」の文字列を検索して、indexOfは1つ目の6を返し、lastIndexOfは、最後となる2つ目の12を返す。

String text = "Hello Dart! Dart is cool.";
int position = text.indexOf("Dart");  // 1つ目のDartの位置、6 を返す
int lastPosition = text.lastIndexOf("Dart");  // 2つ目のDartの位置、12 を返す

開始位置を指定

10文字目「Hello Dart」以降を検索対象にして、indexOfは2つ目の「Dart」の位置12を返す。

String text = "Hello Dart! Dart is cool.";
int position = text.indexOf("Dart", 10);  // 12 を返す

マッチしない例

文字列に「Python」が含まれていないため、-1 を返す。

String text = "Hello Dart! Dart is cool.";
int position = text.indexOf("Python");  // -1 を返す

ファイルの拡張子を取得する

lastIndexOfで最後に出現する.ドットの位置を調べ、substringを利用してそれ以降の文字列(拡張子)を取得する。+1は、.ドットの文字数を加算したもの。

String filename = "image_sample.jpeg";
int extensionStart = filename.lastIndexOf(".");
String extension = filename.substring(extensionStart + 1);  // jpeg を返す

複数の異なる単語にマッチさせる

「apple」または「banana」のどちらかの文字を検索します。正規表現を利用して複数の文字列を対象に検索できます。

String text = "I like apple and orange.";
int positionApple = text.indexOf(RegExp('apple|banana'));
print(positionApple);  // 7 を返す。"apple"の位置

メリット
  • 文字列の中で特定の部分文字列の位置を瞬時に知ることができる。
  • 正規表現にも対応しており、柔軟な検索が可能。
デメリット
  • 大文字・小文字はデフォルトで区別されるため、異なる場合は正規表現の利用が必要。