You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 00:25:31