用正则表达式替换不在某些标签之间的文本

时间:2018-10-24 13:55:54

标签: c# regex

说我有以下文字:

  

“我想要一只粉红色的香蕉给我的狗”

我有一个单词列表及其定义。例如:

  

“粉红色香蕉”:“这是一种奇怪的香蕉”“香蕉”:“这是一种水果”

我想用类似以下的内容替换句子中匹配的单词:

<span tooltip="whatever">word</span>

我可以做到,但是问题是在我的示例中,第一个单词将被正确替换:

"I want a <span tooltip="whatever">pink banana</span> for my dog"

但是第二句话会造成不良行为:

"I want a <span tooltip="whatever">pink <span tooltip="whatever">banana</span></span> for my dog"

这在香蕉一词上产生了两个我不想要的工具提示。基本上,我想用一个正则表达式修改用于替换单词(“ \ b(WORD)\ b”)的正则表达式,该正则表达式仅在单词不在{<span tooltip="(.*)"></span>“内时替换该单词。

这可能吗?

编辑

这是我用来遍历项目并替换单词的代码:

foreach (var glossaryItem in items)
{
    textNode.InnerHtml = Regex.Replace(textNode.InnerHtml, $@"\b({glossaryItem.Name})\b", $"<span tooltip=\"{glossaryItem.Definition}\">$1</span>", RegexOptions.IgnoreCase);
}

1 个答案:

答案 0 :(得分:2)

您可以尝试用负的超前子表达式//PHP code $data['results'] = array("James", "Peter"); echo json_encode($data); (或满足您需求的类似内容)替换正则表达式。

例如:

(?!...)

只有当foreach (var glossaryItem in items) { textNode.InnerHtml = Regex.Replace(textNode.InnerHtml, $@"\b(?<!"">)({glossaryItem.Name})(?!<\/span>)\b", $"<span tooltip=\"{glossaryItem.Definition}\">$1</span>", RegexOptions.IgnoreCase); } 当前不在比赛开始并且">当前不在比赛结束时,这基本上可以使您匹配字符串。