【问题标题】:Regular expression library for .Net that supports lazy evaluation支持惰性求值的 .Net 正则表达式库
【发布时间】:2026-02-17 10:15:02
【问题描述】:

我正在.Net 中寻找一个支持惰性求值的正则表达式库。

注意:我专门寻找惰性评估(即,库不是立即返回文档中的所有匹配项,而是只消耗必要的文档以确定每个请求的下一个匹配项),不支持惰性量词 - 虽然如果它也支持惰性量词,我不会反对!

具体细节:我希望能够对可能包含数十万个正则表达式匹配的非常大的文档运行正则表达式,并使用 IEnumerable<> 语义遍历结果,而无需承担查找所有内容的前期成本匹配。

理想情况下,C# 中的 FOSS,但唯一的要求是 .Net 3.5 应用程序的可用性。

【问题讨论】:

    标签: .net regex lazy-evaluation


    【解决方案1】:

    Match 类'NextMatch method 应该可以满足您的需求:

    返回一个新的匹配结果 下一场比赛,从 最后一场比赛结束的位置 (在最后一个字符之后 匹配的字符)。

    在 Reflector 中快速查看一下可以确认这种行为:

    public Match NextMatch()
    {
        if (this._regex == null)
        {
            return this;
        }
        return this._regex.Run(false, base._length, base._text, this._textbeg,
            this._textend - this._textbeg, this._textpos);
    }
    

    查看链接的 MSDN 参考以获取其用法示例。简而言之,流程类似于:

    Match m = rx.Match(input);
    while (m.Success) 
    {
        // do work
        m = m.NextMatch();
    }
    

    【讨论】:

    • 谢谢!我见过的所有框架类的代码示例都使用 Regex.Matches,而不是 Regex.Match,所以我什至没有意识到它的存在。我觉得很愚蠢,但至少这是一个简单的解决方案。 (c:
    【解决方案2】:

    您确定内置的Regex 类不这样做吗?例如,Match.NextMatch() 方法表明它正在从它到达的地方继续......

    相信如果您调用Regex.Match,它将在第一个匹配时停止,然后在您调用NextMatch 时从那里继续。

    【讨论】: