2017-02-12 91 views
2

我想分析一个字符串,如"ParseThis""parseThis"成像字符串的向量,如["Parse", "This"]["parse", "this"]使用nom箱子。解析驼峰字符串与名字

我试过的所有尝试都没有返回预期的结果。有可能我不明白如何使用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刚刚返回Error(Many0)解析以大写字母开头的字符串和解析以小写字母返回Done开头的字符串,但有一个空字符串作为结果。

如何告诉nom我想分析字符串,并用大写字母分隔(因为可以有第一个大写或小写字母)?

回答

2

您正在寻找以任何字符开头的东西,后面跟着一些非大写字母。作为一个正则表达式,这看起来类似于.[a-z]*。直接转换到标称,这是这样的:

#[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字节,但你应该能够在一个直接的方式扩展这个。

+0

谢谢你的作品非常好!你花了多长时间才知道nom在足够的时间内完成了这项工作?我正在开发一个需要解析大量字符串的大型项目,对于使用nom的更简单的东西,但仍然很难找到我的方式,例如,我从来没有在 – Max

+0

之前看到'!recogn'的例子。例如:我想要现在先通过一个我写'parse_camel_case'的函数来解析一个字符串,然后每个单词用'parse_camel_case'解析它。我正在检查示例解析器,但没有看到我想要做的事情,将'Vec <&str>'从一个解析器拖到另一个解析器。不知道如何继续。 – Max

+0

这就是为什么我参与堆栈溢出的原因;-)例如,我知道“识别!”,因为[有人问过它](http://stackoverflow.com/q/36300373/155423)。我不是nom的文档的最大粉丝(所以我自己编写了我自己的解析器库,**更少的**文档)。你的后续问题可能应该作为一个单独的主题发布,因为我不知道如何解决它,并且不太可能有人会阅读这些评论。 – Shepmaster