0

我想为 EOL 创建一个解析器,我不能只做空格,因为我需要它来忽略空格。

所以我想创建一个匹配“\r\n”或“\n”的解析器。做单个字符很容易Character.EqualTo('\n'),但尝试匹配特定的字符串文字让我感到困惑。我认为这应该是关键字需要做的常规事情,但我不知所措。

4

1 回答 1

1

\r\n组合是一个字符串,这意味着您需要将简单\n解析器(即字符解析器)与字符串解析器组合起来。

怎么样:

    public static void Main()
    {
            var crlf = 
                from carriageReturn in Character.EqualTo('\r')
                from lineFeed in Character.EqualTo('\n')
                select new string(carriageReturn, 1) + lineFeed;

            var lf =
                from lineFeed in Character.EqualTo('\n')
                select new string(lineFeed, 1);

            var eol = crlf.Or(lf);
        
        
        eol.TryParse("\r\n").Dump();  // Successful parsing of \r\n
        eol.TryParse("\n").Dump();    // Successful parsing of \n
        eol.TryParse("\r").Dump();    // Syntax error: unexpected end of input, expected line feed.
    }

如果您更喜欢非 LINQ 语法:

            var eol = Character.EqualTo('\r')
                .Then(carriageReturn => Character.EqualTo('\n').Select( lineFeed => new [] {carriageReturn, lineFeed}))
                .Or(Character.EqualTo('\n').Select(lineFeed => new[] { lineFeed }));

编辑:使用 Span 解析器解析字符串:

            var eol = Span.EqualTo("\n")
                .Or(Span.EqualTo("\r\n"));
于 2021-02-24T20:02:01.017 回答