Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
String::replace() / split() / trim()
Rustの文字列には『replace()』(置換)・『split()』(分割)・『trim()』(空白除去)など便利なメソッドが揃っています。これらは元の文字列を変更せず新しい値を返します。
構文
let s = " Hello, World! ";
// 空白(前後)を除去します。
let trimmed = s.trim(); // "Hello, World!"
let left = s.trim_start(); // "Hello, World! "
let right = s.trim_end(); // " Hello, World!"
// 指定した文字列を置換します。
let replaced = s.trim().replace("World", "Rust"); // "Hello, Rust!"
// 最初のn個だけ置換します。
let s2 = "aabababa".replacen("a", "X", 2); // "XXbababa"
// 文字列を分割してイテレータを返します。
let parts: Vec<&str> = "a,b,c".split(',').collect(); // ["a", "b", "c"]
// 空白で分割します(連続空白も1つに)。
let words: Vec<&str> = "hello world".split_whitespace().collect();
メソッド一覧
| メソッド | 概要 |
|---|---|
| s.trim() | 前後の空白(改行含む)を除去した&strを返します。 |
| s.trim_start() | 先頭の空白を除去した&strを返します。 |
| s.trim_end() | 末尾の空白を除去した&strを返します。 |
| s.trim_matches(pattern) | 前後の指定パターンを除去します。 |
| s.replace(from, to) | すべてのfromをtoに置換した新しいStringを返します。 |
| s.replacen(from, to, n) | 最初のn個のfromをtoに置換します。 |
| s.split(pattern) | パターンで分割してイテレータを返します。 |
| s.splitn(n, pattern) | 最大n個に分割してイテレータを返します。 |
| s.split_whitespace() | 空白(連続空白も対応)で分割してイテレータを返します。 |
| s.lines() | 改行で分割してイテレータを返します。 |
| s.split_once(pattern) | 最初の一致で2分割してOption<(&str, &str)>を返します。 |
サンプルコード
fn main() {
// trim 系メソッドの例です。
let s = " Hello, Rust! \n";
println!("元の文字列: '{}'", s);
println!("trim: '{}'", s.trim());
println!("trim_start: '{}'", s.trim_start());
println!("trim_end: '{}'", s.trim_end());
// trim_matches で特定の文字を除去します。
let quoted = "***secret***";
println!("trim_matches('*'): '{}'", quoted.trim_matches('*'));
println!();
// replace / replacen の例です。
let text = "I love cats. cats are great. cats!";
println!("replace全置換: {}", text.replace("cats", "dogs"));
println!("replacen(2): {}", text.replacen("cats", "dogs", 2));
println!();
// split の例です。
let csv = "apple,banana,,cherry";
let parts: Vec<&str> = csv.split(',').collect();
println!("split(','): {:?}", parts); // 空文字列も含まれます。
// 空要素を除外する場合です。
let filtered: Vec<&str> = csv.split(',').filter(|s| !s.is_empty()).collect();
println!("空除外: {:?}", filtered);
// split_whitespace:連続する空白を1つとして扱います。
let sentence = " Hello World Rust ";
let words: Vec<&str> = sentence.split_whitespace().collect();
println!("split_whitespace: {:?}", words);
// lines:複数行の分割です。
let multiline = "line1\nline2\nline3";
for line in multiline.lines() {
println!("行: {}", line);
}
println!();
// split_once:最初の一致で2分割します。
let key_value = "name=Alice=Bob"; // 最初の = だけで分割します。
if let Some((key, value)) = key_value.split_once('=') {
println!("key: {}, value: {}", key, value);
}
// 実用例:CSVの1行をパースします。
let row = "2026,03,05,Tokyo";
let fields: Vec<&str> = row.split(',').collect();
println!("\n年={}, 月={}, 日={}, 場所={}", fields[0], fields[1], fields[2], fields[3]);
}
概要
これらのメソッドはすべて元の文字列を変更せず新しい値を返します。『split()』はイテレータを返すため、すぐに使わない場合はメモリを節約できます。結果をVecに集めたい場合は末尾に『.collect()』を付けます。
Rustの文字列操作はUTF-8を意識した設計になっています。『split()』のパターンには文字列・char・クロージャなどを渡せます。
split()はパターンが連続すると空文字列の要素も返します。例えば"a,,b".split(',')は["a", "", "b"]になります。空要素を除きたい場合は.filter(|s| !s.is_empty())を組み合わせてください。
文字の反復・変換は『String::chars() / bytes() / parse()』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。