我需要帮助做一个有多个结果的Regex.Replace

时间:2010-08-05 18:07:02

标签: asp.net regex donut-caching

我正在构建一个自定义页面缓存实用程序,它使用类似{Substitution:GetNonCachedData}的语法来获取不应缓存的数据。该解决方案与内置<@ OutputCache %>内容非常相似,但不灵活(我不需要它),最重要的是,它允许在检索非缓存数据时可用会话状态。

无论如何,我有一个方法用hcriplace修改html中的标记替换{Substitution}标记中命名的静态方法的结果。

例如我的页面:

<html>
    <body>
      <p>This is cached</p>
      <p>This is not: {Substitution:GetCurrentTime}</p>
    </body>
</html>

将使用静态方法的结果填充{Substitution:GetCurrentTime}。这是处理发生的地方:

private static Regex SubstitutionRegex = new Regex(@"{substitution:(?<method>\w+)}", RegexOptions.IgnoreCase);

public static string WriteTemplates(string template)
{
    foreach (Match match in SubstitutionRegex.Matches(template))
    {
        var group = match.Groups["method"];
        var method = group.Value;
        var substitution = (string) typeof (Substitution).GetMethod(method).Invoke(null, null);
        template = SubstitutionRegex.Replace()
    }

    return template;

}

变量template是包含自定义标记的html,需要替换。这种方法的问题在于,每当我使用更新的html更新template变量时match.Index变量不再指向正确的字符开头,因为template现在添加了更多字符它

我可以提出一个解决方案,通过计算字符等或其他一些螺旋球的方式,但我首先要确保没有一些更简单的方法来实现这一点与Regex对象。有谁知道怎么做?

谢谢!

2 个答案:

答案 0 :(得分:1)

您应该调用带有Regex.Replace代表的MatchEvaluator的重载。

例如:

return SubstitutionRegex.Replace(template, delegate(Match match) {
    var group = match.Groups["method"];
    var method = group.Value;
    return (string) typeof (Substitution).GetMethod(method).Invoke(null, null);
});

答案 1 :(得分:0)

不是在结果上使用匹配和循环,而是将正则表达式设置为已编译并在while循环中使用单个匹配,直到它停止匹配为止。