0

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

无论如何,我有一个方法可以将 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。这种方法的问题是,每次我template用更新的 html 更新变量时,match.Index变量不再指向正确的字符开头,因为template现在添加了更多字符。

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

谢谢!

4

2 回答 2

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);
});
于 2010-08-05T18:13:20.137 回答
0

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

于 2010-08-05T18:14:07.640 回答