Как сожрать нить до разделителя или до конца с ржавчиной / ном
Я учусь Nom, и в качестве тестового примера я пытаюсь разобрать строку до разделителя. Если мой разделитель, скажем, /
тогда я хочу сопоставить все до этого разделителя. Для этого парсер вроде
named!(gobbledygook, take_until!("/"));
работает. Но я также хочу сопоставить строку, которая заканчивается перед этим разделителем. Итак, я хочу оба foo/bar
а также foo
вернуть "фу". Я не могу найти что-нибудь подходящее в списке на https://github.com/Geal/nom/blob/master/doc/choosing_a_combinator.md.
Я предполагаю, что можно было бы отсканировать либо разделитель, либо конец строки, но, похоже, это настолько распространенный случай, что должно быть что-то очевидное, что я пропускаю?
1 ответ
Вы можете сделать это с take_while!
макро. Этот код:
#[macro_use]
extern crate nom;
use nom::types::CompleteStr
named!(gobbledygook<CompleteStr, CompleteStr>,
take_while!(|ch| ch != '/')
);
fn main() {
println!("1: {}", gobbledygook(CompleteStr("foo/bar")).unwrap().1);
println!("2: {}", gobbledygook(CompleteStr("foo")).unwrap().1);
}
печатает:
1: foo
2: foo
Обратите внимание, что вам нужно использовать CompleteStr
сказать, что foo
полная строка (т. е. нет риска, что полная строка на самом деле foofoo/bar
в котором cas возвращаемое значение будет другим). Смотрите этот документ для деталей о CompleteStr
: https://github.com/Geal/nom/blob/master/doc/upgrading_to_nom_4.md#dealing-with-incomplete-usage