【问题标题】:I don't understand a regexp我不懂正则表达式
【发布时间】:2010-07-04 09:25:35
【问题描述】:

我正在关注使用正则表达式从字符串中删除所有 html 标记的教程 (Ruby):

product.description.gsub(/<.*?>/,'').

我不知道如何解释?。这是否意味着:“至少以前的一个”?在那种情况下,/<.+>/ 不是更合适吗?

【问题讨论】:

  • 请注意,HTML 属性可能包含纯 > 字符。您的正则表达式不考虑这一点。
  • 我正在按照教程进行操作,该教程(正如您所指出的)使用了一种简单的方法来解决问题。我对 *?工作。
  • 另请参阅stackoverflow.com/questions/3075130/… - 我通过说明性示例详细介绍了这一点。

标签: regex regex-greedy


【解决方案1】:

在这种情况下,它会使* 变得懒惰。

1* - 匹配尽可能多的1s。
1*? - 匹配尽可能少的1s。

在这里,当您有 <a>text<b>some more text 时,<.*> 将匹配 <a>text<b>
<.*?> 但是,将匹配 <a><b>

另请参阅:Laziness Instead of Greediness

这里的另一个重要注意事项是,这个正则表达式很容易在有效的 HTML 上失败,最好使用 HTML 解析器,并获取文档的文本。

【讨论】:

    【解决方案2】:

    默认情况下.*greedy,这意味着它尽可能匹配。所以.* 的替换会改变:

    一个例子。 ^----------------------^

    这个 。

    如果你在量词之后使用问号,它会使其不贪婪,从而尽可能少地匹配。使用.*?,替换工作如下:

    一个例子。 ^-^ ^--^ ^-^ ^--^

    变成:

    这是一个例子。

    这与更常见的 ? 用作量词不同,后者表示“匹配零或一”。

    无论哪种方式,如果您的文本是 HTML,您应该使用 HTML 解析器而不是正则表达式。

    【讨论】:

      【解决方案3】:

      * 等量词默认是贪婪的。这意味着它们尽可能匹配。在它们之后添加? 会使它们变得懒惰,因此它们会尽快停止匹配。

      【讨论】:

        【解决方案4】:

        这是我在 regex 库之后找到的关于 regex 的最佳网站:

        http://www.wellho.net/regex/java.html

        希望有帮助!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-03-19
          • 1970-01-01
          • 1970-01-01
          • 2015-12-29
          • 1970-01-01
          • 1970-01-01
          • 2011-08-06
          相关资源
          最近更新 更多