C# 如何解析,直到找到分隔符或使用Sprache到达输入的末尾?

C# 如何解析,直到找到分隔符或使用Sprache到达输入的末尾?,c#,sprache,C#,Sprache,我正试图解析一个字符串,其中包含点缀着星星的文本: var input=“*这是第一部分*这是第二部分” 我想提取星号之间的任何文本以及最后一个星号之后的文本。字符串不会以星形或换行符结尾 我用Sprache编写了一个解析器来尝试实现这一点: Parser<string> thingAfterStarParser = ( from open in Parse.String("*") from rest in Parse.AnyChar.Many().Text()

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

var input=“*这是第一部分*这是第二部分”

我想提取星号之间的任何文本以及最后一个星号之后的文本。字符串不会以星形或换行符结尾

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

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

var result = thingAfterStarParser.AtLeastOnce().Parse(input);
Parser thingAfterStarParser=(
从Parse.String(“*”)中打开
来自Parse.AnyChar.Many().Text()中的rest
选择休息
);
var result=thingAfterStarParser.atlestOnce().Parse(输入);
但是,
result
只得到一个元素,而不是两个。我认为这是因为
rest
一直解析到输入的末尾

如何告诉解析器解析直到输入结束?任何帮助都将不胜感激!多谢各位

我认为这是因为rest一直解析到输入的末尾

你说得对。Parse.AnyChar不会在next*处停止。您可以这样做:

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);
        }
    }
}