文字列の中から特定の部分文字列の位置を探すときはindexOf
やlastIndexOf
を利用します。
indexOf
は、指定したpattern
が文字列str
の中で最初に現れる位置、1から数えたインデックスを返します。一方、lastIndexOf
は最後に現れる位置のインデックスを返します。一致する部分文字列が存在しない場合、両方のメソッドは-1
を返します。
利用場面
- テキストの中からキーワードが最初に出現する場所を知りたい時。
- ファイルの拡張子や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"の位置