如何使用lalrpop解析rust中由“引用的字符串?
Str: Vec<u8> = { "\"" <s:r"([^\"])*"> "\"" => { s.bytes().collect() }, };
这不起作用,我试着把\放在不同的地方,但还没有弄清楚,因为文档中没有太多关于正则表达式的内容。
\
xnifntxz1#
Lalrpop的documentation特别谈到了这一点:如果你需要嵌入引号,你可以使用哈希,比如r#"..."..."#。在rust中,r"..."是一个原始字符串,这意味着所有非引号字符都按字面意思理解,包括\。原始字符串没有转义符,但是当你把r#"而不是r"放在开头时,字符串在找到"#之前不会结束。您可以对任意数量的#字符执行此操作,因此这些字符串都是相同的。
r#"..."..."#
r"..."
r#"
r"
"#
#
"hello" r"hello" r#"hello"# r##"hello"## r###"hello"###
这允许你转义任何",后面跟着任何数量的#,周围有足够的#符号。这一切都是一个小的过度(和大多数事情)。对于正则表达式,您只需要一组周围的#,如文档所示,如下所示。
"
r#"([^"])*"#
但是,如果你想要一个排除"和#的正则表达式,你可以这样做:
r##"([^"#])*"##
请注意,这样做是因为正则表达式经常使用大量的\,这会使转义变得烦人。你也可以把一个普通的字符串加上一个转义的引号(至少在rust中是这样,我还没有在lalrpop中尝试过)。
"([^\"])*"
1条答案
按热度按时间xnifntxz1#
Lalrpop的documentation特别谈到了这一点:
如果你需要嵌入引号,你可以使用哈希,比如
r#"..."..."#
。在rust中,
r"..."
是一个原始字符串,这意味着所有非引号字符都按字面意思理解,包括\
。原始字符串没有转义符,但是当你把r#"
而不是r"
放在开头时,字符串在找到"#
之前不会结束。您可以对任意数量的#
字符执行此操作,因此这些字符串都是相同的。这允许你转义任何
"
,后面跟着任何数量的#
,周围有足够的#
符号。这一切都是一个小的过度(和大多数事情)。对于正则表达式,您只需要一组周围的
#
,如文档所示,如下所示。但是,如果你想要一个排除
"
和#
的正则表达式,你可以这样做:请注意,这样做是因为正则表达式经常使用大量的
\
,这会使转义变得烦人。你也可以把一个普通的字符串加上一个转义的引号(至少在rust中是这样,我还没有在lalrpop中尝试过)。