就本问题而言,CSV 样式的带引号的字符串是一个字符串,其中:
- 字符串正好以 1 开始和结束
"
。 - 字符串中的两个双引号折叠成一个双引号。
"Alo""ha"
→<code>阿罗”哈。 - "" 本身是一个空字符串。
"A""" e"
无法解析错误输入,例如。它是一个A"
, 后面是 junke"
。
我已经尝试了几件事,但都没有完全奏效。
得益于 Mozilla IRC 上#nom 用户 pinkieval 的帮助,我得到了最接近的结果:
use std::error as stderror; /* Avoids needing nightly to compile */
named!(csv_style_string<&str, String>, map_res!(
terminated!(tag!("\""), not!(peek!(char!('"')))),
csv_string_to_string
));
fn csv_string_to_string(s: &str) -> Result<String, Box<stderror::Error>> {
Ok(s.to_string().replace("\"\"", "\""))
}
这不能正确捕获字符串的结尾。
我也尝试将re_match!
宏与 一起使用r#""([^"]|"")*""#
,但这总是导致Err::Incomplete(1)
.
我已经确定Nom 1.0 的给定 CSV 示例不适用于我描述的带引号的 CSV 字符串,但我知道实现不同。