使用一元解析器Sprache,希望匹配数字字符(0..9),但不包括非数字字符,但可以使用前导空格或尾随空格。
我想这应该行得通:
public static readonly Parser<string>
Number = Parse.Numeric.Except(Parse.Letter).AtLeastOnce().Text().Token();或者这样:
public static readonly Parser<int>
Number = Parse.Number.Select(int.Parse).Token();这两种方法都适用于我能想到的所有情况,除了尾随文本:
[Test]
public void Number_ParseNumberWithTrailingLetter_WasUnsuccessfull()
{
var input = new Input("123bogus");
IResult<string> result = Lexicon.Number(input);
Assert.IsFalse(result.WasSuccessful);
}有什么线索吗?
发布于 2013-04-08 11:55:00
如果目标是只接受一个数字,则使用.End()子句消除尾随文本,该子句断言已到达字符串的末尾:
public static readonly Parser<int> MatchInt =
Parse.Number.Select(int.Parse).Token().End();相反,如果您希望接受输入流中的后续数字(由空格分隔),则可以使用.Then()子句为您提供所有这些数字。类似于:
public static readonly Parser<int> MatchInt = Parse.Number.Select(int.Parse).Token();
public static readonly Parser<IEnumerable<int>> MatchIntList =
from int1 in MatchInt
from intRest in Parse.WhiteSpace.AtLeastOnce().Then(_ => MatchInt).Many().End()
select new List<int>() { int1 }.Concat(intRest);没有经过测试-但有希望走上正确的方向。
https://stackoverflow.com/questions/15628874
复制相似问题