在找到分隔符或使用 Sprache 到达输入末尾之前,我该如何解析?

How can I parse until a separator is found or the end of the input is reached with Sprache?

我正在尝试解析一个字符串,其中包含点缀着星号的文本:

var input = "*This is the first part*This is the second part";

我想提取星号之间的任何文本和最后一个星号之后的文本。该字符串未以星号或换行符结尾。

我用 Sprache 编写了一个解析器来尝试实现这一点:

Parser<string> thingAfterStarParser = (
    from open in Parse.String("*")
    from rest in Parse.AnyChar.Many().Text()
    select rest
);

var result = thingAfterStarParser.AtLeastOnce().Parse(input);

但是 result 只以一个元素结束,而不是两个。我认为这是因为 rest 一直解析到输入的末尾。

如何让解析器解析到 stars or 输入结束?任何帮助将非常感激!谢谢

I think it's because rest is parsing all the way to the end of the input.

你说得对。 Parse.AnyChar 不会停在下一个 *.你可以这样做:

public class UnitTest1
{
    readonly ITestOutputHelper output;

    public UnitTest1(ITestOutputHelper output) => this.output = output;

    [Fact]
    public void Split()
    {
        const string input = "*This is the first part*This is the second part";

        var thingAfterStarParser = 
            from open in Parse.String("*")
            from rest in Parse.AnyChar.Except(Parse.Char('*')).Many().Text()
            select rest;

        var result = thingAfterStarParser.AtLeastOnce().Parse(input);

        foreach (var message in result)
        {
            output.WriteLine(message);
        }
    }
}