C# 除了HTML标记中的内容外,哪个正则表达式将匹配文本?

C# 除了HTML标记中的内容外,哪个正则表达式将匹配文本?,c#,regex,C#,Regex,我正在为需要突出显示搜索词的搜索结果页面编写代码。这些术语恰好出现在表格单元格中(应用程序正在GridView行单元格中迭代),这些表格单元格可能包含HTML 目前,我的代码如下所示(如下所示): const string highlightPattern=@“$0”; DataBoundLiteralControl litCustomerComments=(DataBoundLiteralControl)e.Row.Cells[CUSTOMERCOMMENTS_COLUMN]。控件[0]; /

我正在为需要突出显示搜索词的搜索结果页面编写代码。这些术语恰好出现在表格单元格中(应用程序正在GridView行单元格中迭代),这些表格单元格可能包含HTML

目前,我的代码如下所示(如下所示):

const string highlightPattern=@“$0”;
DataBoundLiteralControl litCustomerComments=(DataBoundLiteralControl)e.Row.Cells[CUSTOMERCOMMENTS_COLUMN]。控件[0];
//将“term1 term2”变为“(term1 | term2)”
string spaceDelimited=txtextfilter.Text.Trim();
string pipeDelimited=string.Join(“|”,spaceDelimited.Split(新[]{”“},StringSplitOptions.RemoveEmptyEntries));
字符串searchPattern=“(“+pipeDelimited+”);
//突出显示“客户-评论”列中的搜索词
e、 行.Cells[CUSTOMERCOMMENTS\u COLUMN].Text=Regex.Replace(litCustomerComments.Text、searchPattern、highlightPattern、RegexOptions.IgnoreCase);
令人惊讶的是,它起作用了。但是,有时我匹配的文本是如下所示的HTML:

<span class="CustomerName">Fred</span> was a classy individual.
弗雷德是一个优雅的人。
如果您搜索“class”,我希望突出显示的代码将“class”包装为“classy”,但当然不是正好在那里的HTML属性“class”!如果搜索“Fred”,则应突出显示


那么,有什么好的正则表达式可以确保匹配只发生在html标记之外呢?它不必是超级硬核。我认为,只要确保匹配不在<和>之间就可以了。

您可以使用带有平衡组和反向引用的正则表达式,但我强烈建议您在此处使用

嗯,我不是C#程序员,所以我不知道它使用的正则表达式的风格,但是(?!)应该忽略标记内部的任何内容。它将迫使您在HTML代码中使用<>,但您无论如何都应该这样做。

这个正则表达式应该完成这项工作:
(?]*)(您要检查的正则表达式:Fred | span)
它检查从匹配的字符串开始向后,是否不可能匹配正则表达式
]*

修改代码如下:

const string notInsideBracketsRegex = @"(?<!<[^>]*)";
const string highlightPattern = @"<span class=""Highlight"">$0</span>";
DataBoundLiteralControl litCustomerComments = (DataBoundLiteralControl)e.Row.Cells[CUSTOMERCOMMENTS_COLUMN].Controls[0];

// Turn "term1 term2" into "(term1|term2)"
string spaceDelimited = txtTextFilter.Text.Trim();
string pipeDelimited = string.Join("|", spaceDelimited.Split(new[] {" "}, StringSplitOptions.RemoveEmptyEntries));
string searchPattern = "(" + pipeDelimited + ")";
searchPattern = notInsideBracketsRegex + searchPattern;

// Highlight search terms in Customer - Comments column
e.Row.Cells[CUSTOMERCOMMENTS_COLUMN].Text = Regex.Replace(litCustomerComments.Text, searchPattern, highlightPattern, RegexOptions.IgnoreCase);
const字符串notInsideBracketsRegex=@“(?]*)”;
常量字符串highlightPattern=@“$0”;
DataBoundLiteralControl litCustomerComments=(DataBoundLiteralControl)e.Row.Cells[CUSTOMERCOMMENTS_COLUMN]。控件[0];
//将“term1 term2”变为“(term1 | term2)”
string spaceDelimited=txtextfilter.Text.Trim();
string pipeDelimited=string.Join(“|”,spaceDelimited.Split(新[]{”“},StringSplitOptions.RemoveEmptyEntries));
字符串searchPattern=“(“+pipeDelimited+”);
searchPattern=notInsideBracketsRegex+searchPattern;
//突出显示“客户-评论”列中的搜索词
e、 行.Cells[CUSTOMERCOMMENTS\u COLUMN].Text=Regex.Replace(litCustomerComments.Text、searchPattern、highlightPattern、RegexOptions.IgnoreCase);

编写能够处理CDATA部分的正则表达式将是一件困难的事情。您可能不再认为>关闭了标记

例如,


解决方案是(如前所述)解析器。它们在处理
CDATA
中发现的那种混乱方面更好。madgnome的向后检查不能用于从
]>
中查找起始
,因为
CDATA
部分可能包含文本

,如果有人在您的示例中搜索Fred,它应该突出显示吗?是的。谢谢您的帮助提问。问得好。我会编辑这个问题。要匹配我在示例中描述的“class”,正则表达式中的“class”一词会出现在哪里?我不知道如何使用正则表达式。它本身似乎匹配整个短语中的每个字符位置。正则表达式“(?!”)只是一个否定的前瞻;它说,“从这个位置,我们不是在看一个看起来像标签的东西。“它不会匹配任何东西,也不会阻止匹配任何东西,无论是标签内部还是外部。我知道解决方案并不完美,但权衡所有的起伏,这是迄今为止我找到的最好的解决方案。非常感谢!你救了我一天!:)这是一段很棒的代码。你应该得到比你得到的多得多的选票。非常感谢。4年后,你的回答帮助了另一个人。谢谢
const string notInsideBracketsRegex = @"(?<!<[^>]*)";
const string highlightPattern = @"<span class=""Highlight"">$0</span>";
DataBoundLiteralControl litCustomerComments = (DataBoundLiteralControl)e.Row.Cells[CUSTOMERCOMMENTS_COLUMN].Controls[0];

// Turn "term1 term2" into "(term1|term2)"
string spaceDelimited = txtTextFilter.Text.Trim();
string pipeDelimited = string.Join("|", spaceDelimited.Split(new[] {" "}, StringSplitOptions.RemoveEmptyEntries));
string searchPattern = "(" + pipeDelimited + ")";
searchPattern = notInsideBracketsRegex + searchPattern;

// Highlight search terms in Customer - Comments column
e.Row.Cells[CUSTOMERCOMMENTS_COLUMN].Text = Regex.Replace(litCustomerComments.Text, searchPattern, highlightPattern, RegexOptions.IgnoreCase);