2017-02-12 89 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