我正在构建一个自定义页面缓存实用程序,它使用类似{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对象。有谁知道怎么做?
谢谢!
答案 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循环中使用单个匹配,直到它停止匹配为止。