2014-10-30 2 views
49

Как расколоть строку в Rust? От its documentation это непонятно. В Java я бы сделать это:Как разбить строку в Rust?

"some string 123 ffd".split("123"); 
+0

https://doc.rust-lang.org/std/string/struct.String.html –

+0

@bow Есть ли способ сделать это строковым массивом вместо вектора? – Greg

+0

Я не знаю, как это сделать, по крайней мере, по крайней мере. Вам, вероятно, придется вручную перебирать «Сплит» и устанавливать его в массив. Конечно, это означает, что количество элементов в каждом расколе должно быть одинаковым, так как массивы являются фиксированным размером, и вы должны иметь определенный массив. Я предполагаю, что это может быть больше неприятностей, чем просто создание «Vec». – bow

ответ

64

Использование 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(); 
+8

Вы также можете написать его '.collect :: >()'. –

+0

Как получить длину результата - 'let split'? 'split.len()' не существует. –

+1

@AlexanderSupertramp Используйте '.count()'. 'len()' предназначен только для итераторов, которые знают их точный размер без необходимости их потребления, 'count()' потребляет итератор. – Manishearth

12

Существует специальный метод split for 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"]); 

Split строкой:

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"]); 
4

Там также split_whitespace()

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

Есть три простой способ:

  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()); 
5

split возвращает Iterator, который вам может конвертировать i nto a Vec с использованием collect: split_line.collect::<Vec<_>>(). Проходя через итератора вместо возвращения 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>.
+0

Благодарим вас за подробный ответ, любые идеи, почему 'let x = line.unwrap(). Split (", "). Collect :: >();' не работает, если он не разделен на две отдельные строки: ' пусть x = line.unwrap(); 'и' let x = x.split (","). collect :: >(); '? В сообщении об ошибке говорится: «временное значение, созданное здесь», временное значение, опущенное здесь, в то время как все еще заимствовано » – Greg

+0

Однако оно работает так, как ожидается, если я использую' let x = line.as_ref(). Unwrap(). Split (","). :: >(); ' – Greg

Смежные вопросы