有一种方法
Regex.Replace(string source, string pattern, string replacement)
最后一个参数支持模式替换,例如${groupName}
和其他(但我不知道运行时中的组名)。
在我的情况下,我有动态创建的模式,如:
(?<c0>word1)|(?<c1>word2)|(?<c2>word3)
我的目的是使用取决于组名的值替换每个组。例如,单词“word1”将替换为<span class="c0">word1</span>
。这是针对像谷歌一样突出显示的搜索结果。
是否可以使用上述方法执行此操作而不使用带MatchEvaluator
参数的重载方法?
提前致谢!
答案 0 :(得分:3)
我不认为以你建议的方式使用$ {groupname}是可行的,除非我误解了正在执行的确切替换。原因是替换字符串必须以这样的方式构造,即它考虑每个组名。由于它们是动态生成的,因此无法实现。换句话说,在1语句中,您是如何设计一个替代字符串来覆盖c0 ... cn并替换它们各自的捕获值?您可以遍历名称,但是如何保持修改后的文本完好无损,以便为每个组名执行1次替换?
我确实有一个可能的解决方案。它仍然使用MatchEvaluator重载,但是使用一些lambda表达式和LINQ,你可以将它降低到1行。但是,我将在下面对其进行格式化。也许这符合您的需求或指向正确的方向。
string text = @"The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.";
string[] searchKeywords = { "quick", "fox", "lazy" };
// build pattern based on keywords - you probably had a routine in place for this
var patternQuery = searchKeywords
.Select((s, i) =>
String.Format("(?<c{0}>{1})", i, s) +
(i < searchKeywords.Length - 1 ? "|" : ""))
.Distinct();
string pattern = String.Join("", patternQuery.ToArray());
Console.WriteLine("Dynamic pattern: {0}\n", pattern);
// use RegexOptions.IgnoreCase for case-insensitve search
Regex rx = new Regex(pattern);
// Notes:
// - Skip(1): used to ignore first groupname of 0 (entire match)
// - The idea is to use the groupname and its corresponding match. The Where
// clause matches the pair up correctly based on the current match value
// and returns the appropriate groupname
string result = rx.Replace(text, m => String.Format(@"<span class=""{0}"">{1}</span>",
rx.GetGroupNames()
.Skip(1)
.Where(g => m.Value == m.Groups[rx.GroupNumberFromName(g)].Value)
.Single(),
m.Value));
Console.WriteLine("Original Text: {0}\n", text);
Console.WriteLine("Result: {0}", result);
<强>输出:强>
Dynamic pattern: (?<c0>quick)|(?<c1>fox)|(?<c2>lazy)
Original Text: The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.
Result: The <span class="c0">quick</span> brown <span class="c1">fox</span> jumps over the <span class="c2">lazy</span> dog. The <span class="c0">quick</span> brown <span class="c1">fox</span> jumps over the <span class="c2">lazy</span> dog.