Как сожрать нить до разделителя или до конца с ржавчиной / ном

Я учусь 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

Другие вопросы по тегам