Разбор верблюжьих строк с ном
Я хочу разобрать строку как "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, но вы должны быть в состоянии расширить это прямым способом.