gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 17:39:09 24 4
gpt4 key购买 nike

我有一个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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com