【问题标题】:regex selection正则表达式选择
【发布时间】:2011-06-18 13:56:35
【问题描述】:

我有一个这样的字符串。

<p class='link'>try</p>bla bla</p>

我只想得到&lt;p class='link'&gt;try&lt;/p&gt; 这个我试过了。
/&lt;p class='link'&gt;[^&lt;\/p&gt;]+&lt;\/p&gt;/

但它不起作用。

我该怎么做? 谢谢,

【问题讨论】:

标签: ruby regex


【解决方案1】:

如果那是你的字符串,并且你想要那些 p 标记之间的文本,那么这应该可以工作......

/<p\sclass='link'>(.*?)<\/p>/

您的原因不起作用是因为您将&lt;\/p&gt; 添加到您的非字符范围。它不是从字面上匹配,而是单独检查每个字符。

当然,我必须提到有更好的工具来解析 HTML 片段(例如 HTML 解析器。)

【讨论】:

  • @Matti - 同意!事实上,我会制作一个机器人来支持所有匹配 /\&gt;[^&lt;&gt;]*\bHTML\b[^&lt;&gt;]*\bParser\b[^&lt;&gt;]*\&lt;/ (!) 的答案
  • 这是一个非常脆弱的模式。 See here 如果你一心想在通用 HTML 上使用正则表达式,你真的必须非常小心。
  • @tchrist 确实是这样,但是看看 OP 给出的例子,他们似乎想知道为什么他们的特定正则表达式不起作用。至于 regex/HTML 之争,请参考我最后一句话:)
  • 我只是不知道你为什么使用\s而不使用\s+
  • @tchrist 只是想指出 OP 的明显错误。不过,您的观点非常有效:)
【解决方案2】:
'/<p[^>]+>([^<]+)<\/p>/'

会让你“尝试”

【讨论】:

    【解决方案3】:

    您似乎使用了这个块:[^&lt;\/p&gt;]+ 打算匹配除&lt;/p&gt; 之外的任何内容。不幸的是,这不是它的作用。 [] 块匹配其中的任何字符。在您的情况下,/&lt;p class='link'&gt;[^&lt;\/p&gt;]+ 部分与 &lt;p class='link'&gt;try&lt;/ 匹配,但它并没有紧随预期的 &lt;/p&gt;,因此没有匹配。

    Alex 的解决方案,使用非贪婪限定符是我倾向于解决此类问题的方式。

    【讨论】:

      【解决方案4】:

      我试图减少对任何特定标签的具体化。

      (<[^/]+?\s+[^>]*>[^>]*>)
      

      返回:

      &lt;p class='link'&gt;try&lt;/p&gt;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-11
        • 2016-01-11
        • 2010-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多