使用解析器组合器解析带有转义字符的字符串?

弗雷德里克

我试图用结合库锈解析字符串。我要解析的真实数据看起来像这样:

A79,216,0,4,2,2,N,"US\"PS"

因此,该数据的末尾是带引号的字符串,但该字符串也将包含转义字符。我不知道如何解析其他引号之间的转义字符。

extern crate parser_combinators;

use self::parser_combinators::*;

fn main() {
    let s = r#""HE\"LLO""#;
    let data = many(satisfy(|c| c != '"')); // Fails on escaped " obviously
    let mut str_parser = between(satisfy(|c| c == '"'), satisfy(|c| c == '"'), data);
    let result : Result<(String, &str), ParseError> = str_parser.parse(s);
    match result {
        Ok((value, _)) => println!("{:?}", value),
        Err(err) => println!("{}", err),
    }
}

//=> "HE\\"

上面的代码将成功解析该字符串,但显然在中间的转义字符上将失败,并"HE\\"在最后输出。

我想更改上面的代码,以便打印出来"HE\\\"LLO"

我怎么做?

三月

我有一个功能最强大的JSON解析器作为解析器组合器的基准,该解析器组合器解析了这种转义字符。我在下面提供了指向它的链接和略微简化的版本。

fn json_char(input: State<&str>) -> ParseResult<char, &str> {
    let (c, input) = try!(satisfy(|c| c != '"').parse_state(input));
    let mut back_slash_char = satisfy(|c| "\"\\nrt".chars().find(|x| *x == c).is_some()).map(|c| {
        match c {
            '"' => '"',
            '\\' => '\\',
            'n' => '\n',
            'r' => '\r',
            't' => '\t',
            c => c//Should never happen
        }
    });
    match c {
        '\\' => input.combine(|input| back_slash_char.parse_state(input)),
        _    => Ok((c, input))
    }
}

json_char

由于此解析器可能消耗1或2个字符,因此使用原始组合器是不够的,因此我们需要引入一个可以在所解析的字符上分支的函数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

树而不是字符串的解析器组合器

来自分类Dev

Nom解析器取消转义字符串

来自分类Dev

创建带有转义序列处理功能的带引号的字符串的boost :: spirit :: x3解析器

来自分类Dev

使用PHP解析器解析PHP字符串

来自分类Dev

Swift的字符串解析器?

来自分类Dev

Scala解析器组合器将字符列表转换为字符串

来自分类Dev

使用Scala的解析器repsep拆分字符串

来自分类Dev

Haskell Parsec组合器“很多”应用于接受空字符串的解析器

来自分类Dev

Haskell Parsec组合器“很多”应用于接受空字符串的解析器

来自分类Dev

CSS解析器解析字符串内容

来自分类Dev

如何在Java中的JSON解析器的字符串中转义双引号

来自分类Dev

带有PEG.js的访问控制字符串(ACS)解析器/解释器

来自分类Dev

另一个解析器中的C字符串解析器

来自分类Dev

如何在Python中使用CSV解析器解析字符串?

来自分类Dev

使用Scala Packrat解析器解析简单的字符串

来自分类Dev

使用scala packrat解析器解析一个简单的字符串

来自分类Dev

带有时间戳字符串的Json.NET(Newtonsoft)解析器怎么办?

来自分类Dev

带有时间戳字符串的Json.NET(Newtonsoft)解析器怎么办?

来自分类Dev

PHP简单的HTML DOM解析器查找具有任何字符的字符串

来自分类Dev

为JSON字符串编写解析器

来自分类Dev

了解Boost.spirit的字符串解析器

来自分类Dev

Java API中的条件字符串解析器?

来自分类Dev

不带文字的JSON字符串解析器

来自分类Dev

dateutil解析器,用于月/年字符串

来自分类Dev

lproj字符串文件的解析器

来自分类Dev

为JSON字符串编写解析器

来自分类Dev

解析器字符串C#函数

来自分类Dev

不带文字的JSON字符串解析器

来自分类Dev

Scala 解析器失败:预期字符串文字

Related 相关文章

  1. 1

    树而不是字符串的解析器组合器

  2. 2

    Nom解析器取消转义字符串

  3. 3

    创建带有转义序列处理功能的带引号的字符串的boost :: spirit :: x3解析器

  4. 4

    使用PHP解析器解析PHP字符串

  5. 5

    Swift的字符串解析器?

  6. 6

    Scala解析器组合器将字符列表转换为字符串

  7. 7

    使用Scala的解析器repsep拆分字符串

  8. 8

    Haskell Parsec组合器“很多”应用于接受空字符串的解析器

  9. 9

    Haskell Parsec组合器“很多”应用于接受空字符串的解析器

  10. 10

    CSS解析器解析字符串内容

  11. 11

    如何在Java中的JSON解析器的字符串中转义双引号

  12. 12

    带有PEG.js的访问控制字符串(ACS)解析器/解释器

  13. 13

    另一个解析器中的C字符串解析器

  14. 14

    如何在Python中使用CSV解析器解析字符串?

  15. 15

    使用Scala Packrat解析器解析简单的字符串

  16. 16

    使用scala packrat解析器解析一个简单的字符串

  17. 17

    带有时间戳字符串的Json.NET(Newtonsoft)解析器怎么办?

  18. 18

    带有时间戳字符串的Json.NET(Newtonsoft)解析器怎么办?

  19. 19

    PHP简单的HTML DOM解析器查找具有任何字符的字符串

  20. 20

    为JSON字符串编写解析器

  21. 21

    了解Boost.spirit的字符串解析器

  22. 22

    Java API中的条件字符串解析器?

  23. 23

    不带文字的JSON字符串解析器

  24. 24

    dateutil解析器,用于月/年字符串

  25. 25

    lproj字符串文件的解析器

  26. 26

    为JSON字符串编写解析器

  27. 27

    解析器字符串C#函数

  28. 28

    不带文字的JSON字符串解析器

  29. 29

    Scala 解析器失败:预期字符串文字

热门标签

归档