You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Rust中使用LALRPOP解析双引号包裹的字符串?

在Rust中用LALRPOP正确解析双引号包裹的字符串

你的代码无法运行核心问题在于正则的转义处理和匹配逻辑有问题,以下是两种场景下的正确实现:

场景1:解析不含转义双引号的普通字符串

如果只需要匹配不包含双引号的简单字符串,用r#"..."#原始字符串语法避免转义冲突,正则直接排除双引号即可:

Str: Vec<u8> = {
    "\"" <s:r#"[^"]*"#> "\"" => s.bytes().collect(),
};

场景2:解析包含转义双引号的字符串(如"hello \"world\"")

如果要支持字符串内部的转义双引号,正则需要同时匹配转义序列和非特殊字符,写法如下:

Str: Vec<u8> = {
    "\"" <s:r#"(\\.|[^"\\])*"#> "\"" => s.bytes().collect(),
};

正则逻辑说明:

  • \\.:匹配任意转义序列(比如\"、\\等),第一个\是Rust原始字符串的转义,第二个\是正则里的转义符,.匹配任意字符。
  • [^"\\]:匹配既不是双引号也不是反斜杠的普通字符。
  • 两者用|组合后加*,表示可以重复任意次数,覆盖所有合法的字符串内容。

原代码的问题:

  1. 在LALRPOP的正则中,[^"]不需要额外转义双引号,多余的\会导致正则匹配错误。
  2. 没有处理转义双引号的情况,遇到带\"的字符串会直接终止解析。

内容的提问来源于stack exchange,提问作者Malik Ammar Faisal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 22:52:11