Sprache:如何从数字匹配中排除字母?

时间:2013-03-26 03:29:25

标签: c# .net sprache

使用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);
}

任何线索?

1 个答案:

答案 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);

未经测试 - 但希望能够朝着正确的方向前进。