Как я могу разобрать, пока не будет найден разделитель или не достигнут конец ввода с помощью Sprache? - PullRequest
1 голос
/ 13 марта 2020

Я пытаюсь разобрать строку, содержащую текст с вкраплениями звезд:

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 анализируется полностью до конца ввода.

Как я могу сказать парсеру анализировать до звезд или конца ввода? Любая помощь приветствуется! Спасибо

1 Ответ

2 голосов
/ 13 марта 2020

Я думаю, это потому, что отдых разбирается до конца ввода.

Вы правы в этом. 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);
        }
    }
}
...