c# - C#用IEnumerable <string>中的任何字符串替换字符串中的所有实例

标签 c# regex

我有一个string Snippet和一个IEnumerable<string> Highlights。我想在Snippet中搜索Highlights中任何字符串的所有实例,然后用跨度将单词包装起来。当只有一个Regex.Replace时,我已经设置了一个string Highlight,但是现在有很多选项,我不确定如何更改代码。

例:

Snippet = "Jack and Jill went up the hill to fetch some water"
Highlights = "Jack", "hill", "to"


预期结果:

Snippet = "<span>Jack</span> and Jill went up the <span>hill</span> <span>to</span> fetch some water"


单个字符串的旧代码:

Regex.Replace(Snippet, Highlight, ReplaceHighlightWords, RegexOptions.IgnoreCase

private string ReplaceHighlightWords(Match m)
{
    return "<span class=\"text-highlight\">" + m.Value + "</span>";
}

最佳答案

您可以使用交替:

var rx = string.Forma(@"\b(?:{0})\b", string.Join("|", Highlights));
var res = Regex.Replace(Snippet, rx,
     "<span class=\"text-highlight\">$&</span>", 
     RegexOptions.IgnoreCase);


当您在\b中同时具有totogether时,边界Highlights一词将处理这些情况。注意,您可以完全省略\b来匹配单词中的子字符串。

替换模式中的$&将整个匹配值插入结果中。

如果Highlights可能包含特殊字符,例如([,请先使用Regex.Escape对其进行转义,并且-如果仅在这种情况下要匹配整个单词,请使用\b代替@"(?<!\w)(?:{0})(?!\w)"。这是更高级的代码段:

var Snippet = "Jack and Jill went up the (hill) to fetch some water";
var Highlights = new string[] { "Jack", "(hill)", "to" };
var rx = string.Format(@"(?<!\w)(?:{0})(?!\w)",
    string.Join("|", Highlights.Select(p => Regex.Escape(p))));
var res = Regex.Replace(Snippet, rx,
        "<span class=\"text-highlight\">$&</span>", 
        RegexOptions.IgnoreCase);
Console.WriteLine(res);
// => <span class="text-highlight">Jack</span> and Jill went up the
// <span class="text-highlight">(hill)</span> <span class="text-highlight">to</span> 
//fetch some water


this IDEONE demo

关于如何为基于正则表达式的替换构建优化的替代列表的线程,如Generating the Shortest Regex Dynamically from a source List of Strings所示,也可能值得检查。

关于c# - C#用IEnumerable <string>中的任何字符串替换字符串中的所有实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37977328/

相关文章:

c# - 如何测试哪种方法实现运行得更快

c# - 强制 Pex 忽略生成的代码,我可以在不引用 Pex 程序集的情况下这样做吗?

javascript - 从后面开始拆分字符串

在 R 中使用 stringr 的带有非捕获组的正则表达式

ruby - 如何编写正则表达式以仅查找四位数的数字?

c# - ASP.NET MVC 中的面向方面编程

c# - 带平衡组的正则表达式不仅匹配最外面的匹配项

c# - 是否可以在 MDI C# Winforms 中更改最小化窗口的大小

JavaScript 正则表达式由连字符和空格分隔

sql - 使用正则表达式更新字段的 Postgresql 查询