使用monadic解析器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);
}
任何线索?
答案 0 :(得分:2)
如果目标是仅接受单个数字,那么要消除尾随文本,请使用.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);
未经测试 - 但希望能够朝着正确的方向前进。