在找到分隔符或使用 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);
}
}
}
我正在尝试解析一个字符串,其中包含点缀着星号的文本:
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);
}
}
}