Как расколоть строку в Rust? От its documentation это непонятно. В Java я бы сделать это:Как разбить строку в Rust?
"some string 123 ffd".split("123");
Как расколоть строку в Rust? От its documentation это непонятно. В Java я бы сделать это:Как разбить строку в Rust?
"some string 123 ffd".split("123");
Использование 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();
Вы также можете написать его '.collect ::
Как получить длину результата - 'let split'? 'split.len()' не существует. –
@AlexanderSupertramp Используйте '.count()'. 'len()' предназначен только для итераторов, которые знают их точный размер без необходимости их потребления, 'count()' потребляет итератор. – Manishearth
Существует специальный метод 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"]);
Там также split_whitespace()
fn main() {
let words: Vec<&str> = " foo bar\t\nbaz ".split_whitespace().collect();
println!("{:?}", words);
// ["foo", "bar", "baz"]
}
Есть три простой способ:
По Сепаратору:
s.split("separator")
По пробельные:
s.split_whitespace()
По новой строки:
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());
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>
.Благодарим вас за подробный ответ, любые идеи, почему 'let x = line.unwrap(). Split (", "). Collect ::
Однако оно работает так, как ожидается, если я использую' let x = line.as_ref(). Unwrap(). Split (","). ::
https://doc.rust-lang.org/std/string/struct.String.html –
@bow Есть ли способ сделать это строковым массивом вместо вектора? – Greg
Я не знаю, как это сделать, по крайней мере, по крайней мере. Вам, вероятно, придется вручную перебирать «Сплит» и устанавливать его в массив. Конечно, это означает, что количество элементов в каждом расколе должно быть одинаковым, так как массивы являются фиксированным размером, и вы должны иметь определенный массив. Я предполагаю, что это может быть больше неприятностей, чем просто создание «Vec». – bow