使用Sprache解析带\n的文本失败,求原因及提取换行前文本方法
解析失败原因及解决方案
失败原因
问题出在Token()方法的误用:
Token()的作用是自动跳过解析目标前后的空白字符(包括换行符、空格、制表符等)。你给NEW_LINE_Parser加了.Token(),这会让解析器把目标换行符当成空白跳过,之后没有剩余字符能满足换行符的匹配要求,直接抛出“意外到达输入末尾”的异常。- 另外,
Text解析器的.Token()会自动移除文本前后的空白,如果你需要保留换行前的所有原始文本(包括前后空格),这个Token()也是多余的。
修正后的代码
如果要精确匹配换行符,同时保留换行前的全部文本,修改后的代码如下:
using Sprache; void Main() { // 去掉.Token(),直接匹配换行符 Parser<char> NEW_LINE_Parser = Parse.Char('\n'); // 去掉.Token(),保留换行前的所有原始文本 Parser<string> Text = Parse.CharExcept('\n').Many().Text(); Parser<string> Text_Parser = from commandStr in Text from newLine in NEW_LINE_Parser select commandStr; var result = Text_Parser.Parse("FunTest\n"); Console.WriteLine(result); // 输出:FunTest }
扩展场景处理
如果文本和换行符之间可能存在空白(比如FunTest \n),想要跳过这些空白但保留换行符匹配,可以这样调整换行解析器:
// 先跳过所有空白,再匹配换行符 Parser<char> NEW_LINE_Parser = Parse.WhiteSpace.Many().Then(_ => Parse.Char('\n'));
内容的提问来源于stack exchange,提问作者umbersar
相关产品推荐
相关产品推荐

