1

我使用 .NET Regex 作为一个简单的词法分析器:

var pattern = new Regex("(?<if>if)|(?<then>then)|(?<int>\-?\d+)...");
var tokens = pattern.Matches(input).Cast<Match>()
    .Select(m => new Token { Text = m.Value, Type = TokenTypes.First(tt => !string.IsNullOrEmpty(m.Groups[tt].Value) });

匹配后,我可以通过遍历所有代表令牌类型的命名组并找到实际匹配的组来确定每个令牌的类型。不过,这似乎有点缓慢和笨拙。我想知道:有没有更好的方法来使用 .NET Regex API 查找所有匹配的组?

4

1 回答 1

0

我真的不认为有任何问题。但是,如果您的组都不允许空字符串,您可以使用该Success属性而不是检查Value组的 。这基本上是你已经得到的,但在我看来这似乎更优雅一点:

var tokens = pattern.Matches(input).Cast<Match>()
    .Select(m => new Token { Text = m.Value, Type = TokenTypes.First(tt => m.Groups[tt].Success) });

或者在查询语法中:

var tokens = 
    from Match m in pattern.Matches(input)
    select new Token 
    { 
        Text = m.Value, 
        Type = TokenTypes.First(tt => m.Groups[tt].Success) 
    };
于 2013-11-20T03:34:54.527 回答