1

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

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一直解析到输入的末尾。

如何告诉解析器解析直到星号输入结束?任何帮助将非常感激!谢谢

4

1 回答 1

2

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

你是对的。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);
        }
    }
}
于 2020-03-13T18:59:43.323 回答