gpt4 book ai didi

c# - Regex.Replace在不同场景下的使用方法

转载 作者:太空宇宙 更新时间:2023-11-03 11:57:16 25 4
gpt4 key购买 nike

我之前有过类似的问题,但最后没能真正得到正确的答案。

我有一个函数,它接受我在输入字段中写入的内容,并将其与我从数据库中返回的内容相匹配。它还采用始终为“em”的参数。

函数如下所示:

public static string Hightlight(this string input, string phrase, string tag)
{
foreach (var item in phrase.Split(' '))
{
if (string.IsNullOrWhiteSpace(item))
continue;

input = Regex.Replace(input,
string.Format("(?<phrase>{0})", HttpUtility.HtmlEncode(item)),
string.Format("<{0}>${{phrase}}</{0}>", tag), RegexOptions.IgnoreCase);
}

return input
}

这一直有效,直到人们尝试编写,例如 Martina E .然后,正则表达式尝试将 E 与我正在使用 <em> 构建的输入中的所有 e 进行匹配。 -标签。

有更好的方法吗?我希望输入的最终结果是这样的:<em>Martina</em><em>E</em>

最佳答案

我建议为正则表达式替换创建一个正则表达式,它将匹配标签之外的名称作为整个单词:

return Regex.Replace(
input,
string.Format(@"(<{0}>.*?</{0}>)|(?<!\w)(?:{1})(?!\w)", tag,
string.Join("|",
phrase.Trim().Split(new[] {" "}, StringSplitOptions.RemoveEmptyEntries)
.Select(x => Regex.Escape(HttpUtility.HtmlEncode(x)))
)
),
m => m.Groups[1].Success ? m.Groups[1].Value : string.Format("<{0}>{1}</{0}>", tag, m.Value),
RegexOptions.IgnoreCase
);

参见 C# demo

简而言之:

  • (<{0}>.*?</{0}>)|(?<!\w)(?:{1})(?!\w)将导致像 (<em>.*?</em>)|(?<!\w)(?:Emma|E)(?!\w) 这样的正则表达式将匹配 EmmaE未包含在字字符或 <em> 之间的子字符串中和 </em>在第 1 组中捕获后者
  • phrase.Trim().Split(new[] {" "}, StringSplitOptions.RemoveEmptyEntries).Select(x => Regex.Escape(HttpUtility.HtmlEncode(x))))拆分 phrase使用空格删除空项目,转义每个项目以在正则表达式模式中使用 Regex.Escape在编码为 HTML 之后,然后是
  • string.Join("|", ...)使用管道字符连接项目。
  • m => m.Groups[1].Success ? m.Groups[1].Value : string.Format("<{0}>{1}</{0}>", tag, m.Value)如果第 1 组匹配,则替换为第 1 组内容(现有标记文本),否则添加标记匹配项。

关于c# - Regex.Replace在不同场景下的使用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59068098/

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