【发布时间】:2022-12-19 15:57:33
【问题描述】:
我有一个示例文本行“FunTest\n”,我正在尝试使用 sprache 对其进行解析。我写了一些示例代码,见下文,但它失败并出现异常:
解析失败:到达意外的输入结束;预期(第 2 行,第 1 列);最近消费:FunTest
using Sprache;
void Main()
{
Parser<char> NEW_LINE_Parser = Parse.Char('\n').Token();
Parser<string> Text =
(from content in Parse.CharExcept('\n').Many().Text()
select content).Token();
Parser<string> Text_Parser =
from commandStr in Text
from newLine in NEW_LINE_Parser
select commandStr;
Text_Parser.Parse("FunTest\n");
}
为什么它会因错误而失败?我想提取匹配 '\n' 字符之前的文本
【问题讨论】:
-
看起来解析器
Text已经将 '\n' 符号视为行尾,所以当 newLine 到达那里时,(意外地)没有要解析的文本。如果你想这样做,你应该为 EOL 使用不同的字符。将 '\n' 替换为 '!'在您的代码中将按预期运行。 -
可能是“Parse”使用长度变量,自己进行修剪并期望最终字符串的长度为 8,而在修剪之后它只有 7。也可能是它读取字符串作为可能的文字和期望最终字符串的长度为 8,但收到的字符串长度等于 9...idk。我不会像 Oleg 建议的那样使用 .Trim(),但我会尝试使用 .Split('\n'),在这里您将确切知道事后何时需要插入新行。