我想为 EOL 创建一个解析器,我不能只做空格,因为我需要它来忽略空格。
所以我想创建一个匹配“\r\n”或“\n”的解析器。做单个字符很容易Character.EqualTo('\n')
,但尝试匹配特定的字符串文字让我感到困惑。我认为这应该是关键字需要做的常规事情,但我不知所措。
我想为 EOL 创建一个解析器,我不能只做空格,因为我需要它来忽略空格。
所以我想创建一个匹配“\r\n”或“\n”的解析器。做单个字符很容易Character.EqualTo('\n')
,但尝试匹配特定的字符串文字让我感到困惑。我认为这应该是关键字需要做的常规事情,但我不知所措。
该\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"));