Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
String::len() / is_empty() / contains()
Rustの文字列(String・&str)には長さの取得・空文字判定・検索・前後判定など多くのメソッドが用意されています。『len()』『is_empty()』『contains()』『starts_with()』『ends_with()』などがよく使われます。
構文
let s = String::from("Hello, Rust!");
// バイト数を返します(文字数ではありません)。
let len = s.len(); // 12(ASCII文字は1バイト)
// 空文字かどうかを返します。
let empty = s.is_empty(); // false
// 部分文字列が含まれるか確認します。
let has = s.contains("Rust"); // true
// 指定した文字列で始まるか確認します。
let starts = s.starts_with("Hello"); // true
// 指定した文字列で終わるか確認します。
let ends = s.ends_with("!"); // true
// 最初に一致した位置(バイトオフセット)を返します。
let idx = s.find("Rust"); // Some(7)
// すべての一致位置を取得します。
let positions: Vec<_> = s.match_indices("l").collect();
メソッド一覧
| メソッド | 概要 |
|---|---|
| s.len() | 文字列のバイト数を返します(文字数ではありません)。 |
| s.is_empty() | 文字列が空(len() == 0)かどうかを返します。 |
| s.contains(pattern) | パターンが含まれていれば true を返します。 |
| s.starts_with(prefix) | 指定した文字列・文字で始まれば true を返します。 |
| s.ends_with(suffix) | 指定した文字列・文字で終われば true を返します。 |
| s.find(pattern) | 最初にマッチしたバイトオフセットをOption<usize>で返します。 |
| s.rfind(pattern) | 最後にマッチしたバイトオフセットをOption<usize>で返します。 |
| s.match_indices(pattern) | すべてのマッチ位置と文字列をイテレータで返します。 |
| s.chars().count() | Unicode文字数を返します(日本語など多バイト文字対応)。 |
| s.is_ascii() | すべての文字がASCII文字かどうかを返します。 |
サンプルコード
fn main() {
let s = String::from("Hello, Rust! Rustは素晴らしい。");
// バイト数と文字数の違いです。
println!("len(バイト数): {}", s.len());
println!("chars().count()(文字数): {}", s.chars().count());
// 空文字の判定です。
let empty = String::new();
let non_empty = String::from("hello");
println!("empty.is_empty(): {}", empty.is_empty());
println!("non_empty.is_empty(): {}", non_empty.is_empty());
println!();
// contains・starts_with・ends_with です。
println!("'Rust'を含む: {}", s.contains("Rust"));
println!("'Python'を含む: {}", s.contains("Python"));
println!("'Hello'で始まる: {}", s.starts_with("Hello"));
println!("'。'で終わる: {}", s.ends_with("。"));
println!("'Rust'で終わる: {}", s.ends_with("Rust"));
println!();
// find(最初の位置)です。
match s.find("Rust") {
Some(i) => println!("最初の'Rust'の位置: {}", i),
None => println!("'Rust'は見つかりません"),
}
match s.find("Python") {
Some(i) => println!("最初の'Python'の位置: {}", i),
None => println!("'Python'は見つかりません"),
}
// rfind(最後の位置)です。
if let Some(i) = s.rfind("Rust") {
println!("最後の'Rust'の位置: {}", i);
}
println!();
// match_indices(すべての一致)です。
let text = "banana";
let positions: Vec<_> = text.match_indices("an").collect();
println!("'banana'内の'an'の位置: {:?}", positions);
// ASCII判定です。
println!("'Hello'はASCII: {}", "Hello".is_ascii());
println!("'Hello世界'はASCII: {}", "Hello世界".is_ascii());
// 実用例:入力値の検証です。
let input = " ";
if input.trim().is_empty() {
println!("\n入力が空です");
}
}
概要
Rustの文字列はUTF-8エンコードされており、『len()』はバイト数を返します。日本語などのマルチバイト文字を含む場合はバイト数と文字数が異なります。文字数を取得するには『s.chars().count()』を使ってください。
『find()』はバイトオフセットを返します。このオフセットは文字境界である保証があるため、スライス『&s[0..idx]』のように使えます。ただし日本語文字の「途中」を指すインデックスでスライスするとパニックします。
len()は文字数(Unicodeコードポイント数)ではなくバイト数を返します。文字数が必要な場合は必ずchars().count()を使ってください。
文字列の置換・分割・トリムは『String::replace() / split() / trim()』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。