2

我想将字符串解析为类似"ParseThis"或使用nom crate"parseThis"的字符串向量。["Parse", "This"]["parse", "this"]

我尝试过的所有尝试都没有返回预期的结果。我可能还不明白如何使用 nom 中的所有功能。

我试过:

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只返回 aError(Many0)用于解析以大写字母开头的字符串,并返回用于解析以小写字母开头Done但结果为空字符串的字符串。

我如何告诉 nom 我要解析字符串,用大写字母分隔(假设可以有第一个大写或小写字母)?

4

1 回答 1

3

您正在寻找以任何字符开头,后跟多个非大写字母的内容。作为一个正则表达式,它看起来类似于.[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 字节,但您应该能够以直接的方式扩展它。

于 2017-02-12T04:12:20.027 回答