超级大国:创建解析器以匹配“\r\n”或“\n”(更一般:匹配字符串文字)
Superpower: Create parser to Match against "\r\n" or "\n" ( More general: match against a string literal)
我想为 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"));
我想为 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"));