想要在Regex.Replace通话期间编码文本
我有一个需要帮助的正则表达式电话。
我尚未发布我的正则表达式,因为它与此处无关。
我想要做的是,在替换期间,我还想通过对影响正则表达式的整个文本执行Html.Encode来修改$ {test}部分。
基本上,将包含在regex范围内的整个文本用粗体标签包装,然后用Html进行包装。在粗体标签之间对文本进行编码。
RegexOptions regexOptions = RegexOptions.Compiled | RegexOptions.IgnoreCase; text = Regex.Replace(text, regexBold, @"<b>${text}</b>", regexOptions);
解决方案
回答
在这种情况下,请不要使用Regex.Replace。
foreach(Match in Regex.Matches(...)) { //do your stuff here }
回答
如果执行Regex.Match,则在第0个索引处生成的匹配对象组是与正则表达式匹配的输入的子集。
我们可以使用它来缝合粗体标签并在那里进行编码。
回答
我们可以在{}中填写代码以添加粗体标记并对文本进行编码吗?
我对如何将更改应用到整个文本块以及最后替换text变量中的部分感到困惑。
回答
这是这里的实现,我曾经从内容中挑选出特殊的替换字符串并将其本地化。
protected string FindAndTranslateIn(string content) { return Regex.Replace(content, @"\{\^(.+?);(.+?)?}", new MatchEvaluator(TranslateHandler), RegexOptions.IgnoreCase); } public string TranslateHandler(Match m) { if (m.Success) { string key = m.Groups[1].Value; key = FindAndTranslateIn(key); string def = string.Empty; if (m.Groups.Count > 2) { def = m.Groups[2].Value; if(def.Length > 1) { def = FindAndTranslateIn(def); } } if (group == null) { return Translate(key, def); } else { return Translate(key, group, def); } } return string.Empty; }
从匹配评估器委托中,我们返回要替换的所有内容,因此,在我返回的地方,我们将具有粗体标签和一个编码调用,我的还支持递归,因此需求有些复杂,但是我们可以简化示例需求。
这等效于对匹配项进行迭代并执行部分replace方法作业。它只是为我们节省了一些代码,并且我们可以使用精美的shmancy委托。
回答
有一种非常简单的方法(在.net中)。它称为MatchEvaluator,它使我们可以进行各种很酷的查找和替换。从本质上讲,我们只需向Regex.Replace方法提供方法的名称,该方法的名称返回一个字符串,并将Match对象作为其唯一参数。对特定匹配项(html编码)执行任何有意义的操作,返回的字符串将替换输入字符串中匹配项的整个文本。
示例:假设我们要查找添加了两个数字(在文本中)的所有位置,并且想要用实际数字替换表达式。我们不能使用严格的正则表达式方法来做到这一点,但是当我们放入MatchEvaluator时,它变得很容易。
public void Stuff() { string pattern = @"(?<firstNumber>\d+)\s*(?<operator>[*+-/])\s*(?<secondNumber>\d+)"; string input = "something something 123 + 456 blah blah 100 - 55"; string output = Regex.Replace(input, pattern, MatchMath); //output will be "something something 579 blah blah 45" } private static string MatchMath(Match match) { try { double first = double.Parse(match.Groups["firstNumber"].Value); double second = double.Parse(match.Groups["secondNumber"].Value); switch (match.Groups["operator"].Value) { case "*": return (first * second).ToString(); case "+": return (first + second).ToString(); case "-": return (first - second).ToString(); case "/": return (first / second).ToString(); } } catch { } return "NaN"; }
在http://msdn.microsoft.com/zh-cn/library/system.text.regularexpressions.matchevaluator.aspx中查找更多信息