代码之家  ›  专栏  ›  技术社区  ›  Tahir Hassan

Sprache-无法识别此序列

  •  1
  • Tahir Hassan  · 技术社区  · 6 年前

    我想匹配字符串,其中第一个字符是字母,然后是数字或字母的多个字符,最后以字母结尾。例如 a11a11a 是正确的,但是 a11aa11 不正确,因为它以数字而不是字母结尾。

    为此,我编写了以下代码:

    var grammar =
        from first in Parse.Letter.Once()
        from rest in Parse.LetterOrDigit.Many()
        from end in Parse.Letter.Once()
        select new string(first.Concat(rest).Concat(end).ToArray());
    
    var result = grammar.TryParse("a111a");
    

    不幸的是 LetterOrDigit.Many() 也会消耗最后一个字母。

    有什么办法可以避免这种情况吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Tahir Hassan    6 年前

    Parser<IEnumerable<char>> A = null, B = null, C = null;
    
    var letter = Parse.Letter.Once();
    var digit = Parse.Digit.Once();
    
    B =
        (
        from d in digit
        from cs in Parse.Ref(() => C)
        select d.Concat(cs)
        ).Or
        (
            from l in letter
            from bs in Parse.Ref(() => B)
            select l.Concat(bs)
        ).Or(letter);
    
    C = (
        from d in digit
        from bs in Parse.Ref(() => B)
        select d.Concat(bs)
        ).Or(letter);
    
    A = (
        from l in letter
        from bs in Parse.Ref(() => B)
        select l.Concat(bs)
        ).Or(letter);
    
    var grammar =
        from _ in Parse.WhiteSpace.Many()
        from a in A
        from __ in Parse.WhiteSpace.Many()
        select a;
    

    Or

    Parse.Regex("[a-z]([a-z0-9]*[a-z])?")