我不懂正则表达式

时间:2010-07-04 09:25:36

标签: regex regex-greedy

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

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

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

4 个答案:

答案 0 :(得分:8)

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

1* - 尽可能多地匹配1个。{ 1*? - 尽可能少匹配1

此处,当您<a>text<b>some more text时,<.*>将与<a>text<b>匹配 但是,<.*?>会匹配<a><b>

另请参阅:Laziness Instead of Greediness

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

答案 1 :(得分:6)

默认情况下,.*greedy,这意味着它尽可能匹配。因此,.*替换将更改:

This <b>is</b> an <i>example</i>.
     ^-------------------------^

This .

如果在量词之后使用问号,则会使其非贪婪,以便尽可能少地匹配。使用.*?替换工作如下:

This <b>is</b> an <i>example</i>.
     ^-^  ^--^    ^-^       ^--^

变为:

This is an example.

这与?作为量词的更常见用法不同,它意味着'匹配零或一个'。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

这是我在正则表达式库之后找到的关于正则表达式的最佳网站:

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

希望有所帮助!