正则表达式:是否比较懒惰?

我一直写这样的正则表达式

<A HREF="([^"]*)" TARGET="_blank">([^<]*)</A>

但是我刚刚了解了这个lazy thing,我可以这样写

<A HREF="(.*?)" TARGET="_blank">(.*?)</A>

使用第二种方法有什么缺点?正则表达式肯定更紧凑(甚至SO更好地解析).

编辑:这里有两个最好的答案,它们指出了表达式之间的两个重要区别. ysth的回答指出了非贪婪/懒惰的弱点,超链接本身可能包含A标签的其他属性(绝对不好). Rob Kennedy指出了贪婪的例子中的弱点,因为这个锚文本不能包含其他标签(绝对不行,因为它不会抓住所有的锚文本)…所以答案是,正则表达式是他们看似相同的懒惰和非懒惰解决方案可能在语义上并不相同.

编辑:第三个最好的答案就是艾伦M关于表达的相对速度.暂时我会把他的最佳答案告诉他,让人们给他更多的点:)

另一件需要考虑的是目标文本多长时间,以及量化子表达式将被匹配多少.例如,如果您尝试匹配整个< BODY>元素在一个大的HTML文档中,你可能会试图使用这个正则表达式:

/<BODY>.*?<\/BODY>/is

但是,这样做会做很多不必要的工作,一次匹配一个角色,同时在每个角色之前做一个负面的前瞻.你知道< / BODY>标签将非常接近文档的末尾,所以聪明的事情是使用一个正常的贪心量词;让它扼杀整个文档的其余部分,然后回溯匹配结束标签所需的几个字符.

在大多数情况下,您不会注意到贪心和不情愿的量词之间的速度差异,但这是要记住的.您在使用不情愿的量词时应该明智的主要原因是其他人所指出的那些:他们可能会不情愿地做这件事,但是如果要实现整体的话,它们会比你想要的更匹配比赛.

相关文章
相关标签/搜索