正则表达式不包括HTML标记中包含的匹配项

时间:2018-01-12 14:05:16

标签: c# regex html-parsing

我正在尝试创建一个Regex表达式来匹配HTML文档中的内容,但我希望排除标记本身中包含的匹配项。请考虑以下事项:

<p>Here is some sample text for my widgets</p>
<a href="http://mywidgets.nowhere">Click here to view my widgets</a>

我想匹配'小部件',以便我可以用不同的字符串替换它,比如'绿色框',而不用替换网址中的匹配。

匹配'小部件'很简单,但是我很难添加排除以检查'小部件'何时出现在开始和结束标记'&lt;&gt;'中。

我目前的工作方式:作为第一步,我开始匹配'&lt;&gt;'中包含的'小部件'。 (然后我可以继续将其作为后面的排除)但是下面的字符串似乎与整个文档匹配,即使我在结束时放置了一个排除&gt;确保小部件出现在标签内。

<.*[^>]widgets.*[^<]>+ 

这可能是懒惰/贪婪,但我不能完全解决它!

2 个答案:

答案 0 :(得分:3)

概述

没有意义这是一个很好的答案,因为它使用正则表达式解析HTML,但它确实适用于OP给出的测试用例。

有关详细信息,请参阅RegEx match open tags except XHTML self-contained tags

代码

See regex in use here

(?<!<[^>]*)widgets

说明

  • (?<!<[^>]*)否定的背后隐藏确保前面的内容不是<后面跟>以外的任何字符(任意次)
  • widgets按字面意思匹配

答案 1 :(得分:0)

这可能部分有效:

(?:^|>)[^<]*widgets

这将从一行的开头(如果使用/m标志)或标签的结尾(因此我们知道我们不在一个)开始查看,并提前尽可能多的字符不是&lt;,意味着在查找小部件之前无法打开另一个标记。 问题是,如果你有一个&gt;它可能会给出奇怪的结果。在标记内部(例如,在javascript中),或者如果单个标记可以跨越多行,并且它将在相同的子字符串中找不到“小部件”的多个实例。要解决这些问题,最好使用ctwheels

建议的实际XML解析器