使用 nom 解析驼峰式字符串

Parsing camel case strings with nom

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

我尝试过的所有尝试都没有return预期的结果。可能我还不明白怎么使用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 只是 return 一个 Error(Many0) 用于解析以大写字母开头的字符串和解析以小写字母开头的字符串 return s Done 但结果为空字符串。

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

您正在查找以任意字符开头,后跟 non-uppercase 个字母的内容。作为正则表达式,这看起来类似于 .[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"])
}

当然,您可能需要注意实际匹配正确的 non-ASCII 字节,但您应该能够以 straight-forward 方式扩展它。