【问题标题】:Regex excluding matches contained within a HTML tag正则表达式排除包含在 HTML 标记中的匹配项
【发布时间】:2018-06-22 00:16:46
【问题描述】:

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

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

我想匹配“widgets”,这样我就可以用不同的字符串替换它,比如“green box”,而不用替换 url 中的匹配项。

匹配 'widgets' 很简单,但是当它出现在开始和结束标记 '' 中时,我正在努力添加排除以检查'widgets'。

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

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

这可能归结为懒惰/贪婪,但我无法完全解决!

【问题讨论】:

标签: c# regex html-parsing


【解决方案1】:

概述

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

更多信息请参见RegEx match open tags except XHTML self-contained tags


代码

See regex in use here

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

说明

  • (?&lt;!&lt;[^&gt;]*) 负向后视确保前面不是&lt; 后跟除&gt; 之外的任何字符(任意次数)
  • widgets 按字面意思匹配

【讨论】:

    【解决方案2】:

    这可能会部分起作用:

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

    这将从一行的开头(如果使用/m 标志)或标签的结尾(所以我们知道我们不在一个)开始查找,并推进尽可能多的字符而不是(例如,在 javascript 中),或者如果单个标签可以跨越多行并且它不会在相同的子串。要解决这些问题,您最好按照 ctwheels 的建议使用实际的 XML 解析器

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-06
      • 2012-04-02
      • 2011-04-01
      相关资源
      最近更新 更多