我想匹配第一个字符是字母的字符串,然后是多个数字或字母的字符,最后以字母结尾。例如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()
也消耗了最后一个字母。
有什么办法可以避免这种情况?
答案 0 :(得分:1)
这是一个解决方案:
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
中的子句需要正确的顺序。
评论者建议使用正则表达式。您可以在Sprache中使用它们:
Parse.Regex("[a-z]([a-z0-9]*[a-z])?")