【问题标题】:Confused about Grabbing HTML Tags regex pattern对抓取 HTML 标签正则表达式模式感到困惑
【发布时间】:2014-07-12 02:28:29
【问题描述】:

我正在阅读 regular-expressions.info 示例以尝试了解更多正则表达式模式。

第一个示例Grabbing HTML Tags 讨论了特定 HTML 标记的开始和结束对的正则表达式。

<TAG\b[^>]*>(.*?)</TAG>

我在这里有点困惑。为什么\b[^&gt;]*被添加到上面的正则表达式模式中,使用下面的正则表达式模式可以实现同样的事情:

<TAG>(.*?)</TAG>

为什么要使用这个额外的正则表达式模式?它对任何性能都有帮助吗?

【问题讨论】:

  • 此链接可能相关(或至少有趣):stackoverflow.com/questions/1732348/…
  • 我明白了。我只是在寻找一些例子来解释这个额外的正则表达式模式的使用。谢谢大家。

标签: java regex


【解决方案1】:
  • 这是为了匹配 &lt;a href=...&gt; stuff &lt;/a&gt; 之类的内容,而不是简单的 &lt;b&gt; stuff &lt;/b&gt;,您的选项会起作用。
  • 需要\b 边界以避免匹配&lt;attribute ...&gt; stuff &lt;/a&gt; 之类的内容
  • 需要在开始和结束标签之间使用惰性量词.*?,而不是[^&lt;]*,因为在开始和结束标签之间可能有另一个标签(例如&lt;b&gt;)

【讨论】:

  • 谢谢我知道了。我真的忘记了这种用途。
  • 感谢您的描述。我只是在寻找这种额外模式的用途。这对我来说很清楚。
  • 谢谢,很高兴它有帮助。 :)
【解决方案2】:

一些开始标签具有&lt;img src="asdf.png"&gt; 等属性。在到达&gt; 之前,标签不会结束,因此单词边界和非&gt; 字符与src="asdf.png" 匹配。

【讨论】:

    【解决方案3】:

    \b[^&gt;]* 中

    <TAG\b[^>]*>(.*?)</TAG>
    

    Debuggex Demo

    允许在开放标签中有文本(例如参数:width="30")和空格(只要它只是TAG 而不是TAGX 或其他类型——这就是@987654334 @word boundary 用于)。 html 中的语法和间距非常松散。允许额外的参数和空格总是安全的,因为单个 html 标记可以跨越多行。

    后一个正则表达式

    <TAG>(.*?)</TAG>
    

    Debuggex Demo

    只允许开始标签是完全&lt;TAG&gt;,然后是“一些可能跨越多行的文本”,然后是&lt;/TAG&gt;。

    .*? 中的? 是reluctance,这意味着下一个 关闭&lt;/TAG&gt; 是唯一可以匹配的。删除? 会将其更改为greedy,这意味着匹配搜索字符串中的最后关闭&lt;/TAG&gt;。


    请务必查看Stack Overflow Regular Expressions FAQ :)

    【讨论】:

      【解决方案4】:

      因为没有单词边界,它匹配的不仅仅是标签。

      DEMO

      您可以尝试演示。只需在模式中使用和不使用 \b 即可。

      <TAG\b[^>]*>(.*?)</TAG>
      

      说明:

      • &lt; 匹配 &lt; 符号。
      • TAG标签名称
      • \b 匹配单词字符和非单词字符。
      • [^&gt;]* 匹配任何不属于&gt; 的字符零次或多次。
      • (.*?) 捕获开始和结束标记内的部分。? 在* 进行不情愿匹配之后。
      • &lt;/TAG&gt; 匹配结束标签。

      例如:

      输入:

      <a href="www.foo.com">link</a>
      <ahref="www.foo.com">link</a>
      

      正则表达式:

      <a[^>]*>(.*?)<\/a>
      

      上面的正则表达式将匹配两个链接。

      正则表达式:

      <a\b[^>]*>(.*?)<\/a>
      

      但这会匹配第一个,因为a 和第一个space 字符之间存在单词边界。

      【讨论】:

      • 忘记添加正确的链接。
      • @Braj 现在检查一下。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-14
      • 1970-01-01
      • 1970-01-01
      • 2014-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多