Разбор верблюжьих строк с ном

Я хочу разобрать строку как "ParseThis" или же "parseThis" в вектор строк, таких как ["Parse", "This"] или же ["parse", "this"] используя номинальный ящик.

Все попытки, которые я пробовал, не дают ожидаемого результата. Возможно, я пока не понимаю, как использовать все функции в ном.

Я старался:

named!(camel_case<(&str)>, 
       map_res!(
           take_till!(is_not_uppercase),
           std::str::from_utf8));

named!(p_camel_case<&[u8], Vec<&str>>,
       many0!(camel_case));

Но p_camel_case просто возвращает Error(Many0) для разбора строки, которая начинается с заглавной буквы, и для разбора строки, которая начинается с строчной буквы, она возвращает Done но с пустой строкой в ​​результате.

Как я могу сказать Nom, что я хочу проанализировать строку, разделенную заглавными буквами (учитывая, что могут быть первые заглавные или строчные буквы)?

1 ответ

Решение

Вы ищете вещи, которые начинаются с любого символа, за которым следует ряд заглавных букв. Как регулярное выражение, это выглядело бы сродни .[a-z]*, Переведено напрямую в nom, это что-то вроде:

#[macro_use]
extern crate nom;

use nom::anychar;

fn is_uppercase(a: u8) -> bool { (a as char).is_uppercase() }

named!(char_and_more_char<()>, do_parse!(
    anychar >>
    take_till!(is_uppercase) >>
    ()
));

named!(camel_case<(&str)>, map_res!(recognize!(char_and_more_char), std::str::from_utf8));

named!(p_camel_case<&[u8], Vec<&str>>, many0!(camel_case));

fn main() {
    println!("{:?}", p_camel_case(b"helloWorld"));
    // Done([], ["hello", "World"])

    println!("{:?}", p_camel_case(b"HelloWorld"));
    // Done([], ["Hello", "World"])
}

Конечно, вы, вероятно, должны быть осторожны с фактическим сопоставлением правильных байтов, отличных от ASCII, но вы должны быть в состоянии расширить это прямым способом.

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