web-dev-qa-db-ja.com

Rustで文字列を分割するにはどうすればよいですか?

ドキュメント からは、明確ではありません。 Javaでは、次のようにsplitメソッドを使用できます。

"some string 123 ffd".split("123");
94
アレックス

split() を使用します

let mut split = "some string 123 ffd".split("123");

これによりイテレータが得られ、ループするか、collect()を使用してベクトルにすることができます。

for s in split {
    println!("{}", s)
}
let vec = split.collect::<Vec<&str>>();
// OR
let vec: Vec<&str> = split.collect();
108
Manishearth

3つの簡単な方法があります。

  1. 区切り文字

    s.split("separator")
    
  2. 空白

    s.split_whitespace()
    
  3. 改行

    s.lines()
    

各種類の結果は反復子です:

let text = "foo\r\nbar\n\nbaz\n";
let mut lines = text.lines();

assert_eq!(Some("foo"), lines.next());
assert_eq!(Some("bar"), lines.next());
assert_eq!(Some(""), lines.next());
assert_eq!(Some("baz"), lines.next());

assert_eq!(None, lines.next());
29
DenisKolodin

特別なメソッドがあります split struct Stringの場合

fn split<'a, P>(&'a self, pat: P) -> Split<'a, P> where P: Pattern<'a>

文字で分割:

let v: Vec<&str> = "Mary had a little lamb".split(' ').collect();
assert_eq!(v, ["Mary", "had", "a", "little", "lamb"]);

文字列で分割:

let v: Vec<&str> = "lion::tiger::leopard".split("::").collect();
assert_eq!(v, ["lion", "tiger", "leopard"]);

閉鎖による分割:

let v: Vec<&str> = "abc1def2ghi".split(|c: char| c.is_numeric()).collect();
assert_eq!(v, ["abc", "def", "ghi"]);
22

splitIterator を返します。これは Vecsplit_line.collect::<Vec<_>>()を使用してcollectに変換できます。 Vecを直接返す代わりにイテレータを使用すると、いくつかの利点があります。

  • splitはレイジーです。これは、必要になるまで実際に行を分割しないことを意味します。そうすれば、最初の数個の値:split_line.take(2).collect::<Vec<_>>()のみが必要な場合、または整数に変換可能な最初の値:split_line.filter_map(|x| x.parse::<i32>().ok()).next()のみが必要な場合でも、文字列全体を分割する時間を無駄にしません。この最後の例では、「23.0」を処理しようとして時間を浪費しませんが、「1」が見つかるとすぐに処理を停止します。
  • splitは、結果の保存方法を想定していません。 Vec を使用できますが、 FromIterator<&str> を実装するものであれば何でも使用できます。たとえば、 LinkedList または VecDeque =、またはFromIterator<&str>を実装するカスタムタイプ。
6
Jmb

split_whitespace() もあります

fn main() {
    let words: Vec<&str> = "   foo   bar\t\nbaz   ".split_whitespace().collect();
    println!("{:?}", words);
    // ["foo", "bar", "baz"] 
}
4
jayelm