惰性量词在这个特定的正则表达式中有什么不同?

我正在阅读有关正则表达式的具体示例/练习。
要处理的句子是:

<b>Billions</b> and <b>Zillions</b> of suns   

想要的比赛是Billions<b></b>之间的文字
该解决方案提出了2个正则表达式:
第一:

<b>((?!<b>).)*?</b>   

我不明白为什么这里需要懒惰的量词。 在我看来,这是多余的。
然后第二个解决方案提出以下内容以便能够删除懒惰限定符:
第二:

<b>((?!</?b>).)*?</b>   

我可以理解第二个解决方案,但对我来说,解决与懒惰有关的任何问题似乎都是无关紧要的。 我的意思是:

<b>((?!<b>).)*</b>   

据我所知可以与Billions匹配得很好。 它会贪婪地达到Zillions的<b> ,然后它会开始回溯,直到它达到Billions的</b>并达到匹配。

例:

$ perl -e '  
my $var = "<b>Billions</b> and <b>Zillions</b> of suns";  
$var =~ /<b>(((?!<b>).)*)</b>/;print "$1n";  
'  
Billions  

我在这里误解了什么吗?
作者是否可以编写一个对所有工具有效的正则表达式?


<b>((?!<b>).)*?</b><b>((?!<b>).)*</b>之间的区别仅仅在于表现和回溯量参与其中。

第一个正则表达式将在你的例句中与Billions匹配并停在那里。

第二个正则表达式将与Billions and匹配,然后在找到匹配之前开始回溯。 因此第二个变得效率较低。 但是如果再看一次,如果包含回溯字符的数量,那么正则表达式也可以等同于<b>.*?</b> ,只要没有嵌套标记(例如<b>Billions and <b>Zillions</b></b> of suns但这很愚蠢,因为嵌套<b>不会改变格式。)

我会自己使用:

<b>((?!</b>).)*</b>

作为正则表达式。 所述</b>在负先行防止了匹配</b>和到底是一个小大于第一正则表达式的效率更高。

例如,您可以看到在获得以下项目的匹配之前所采用的“步骤”数量:

  • 第一个正则表达式(50步)
  • 第二个正则表达式(66步)
  • 我的正则表达式(48步)
  • 链接地址: http://www.djcxy.com/p/76985.html

    上一篇: What difference does the lazy quantifier make in this specific regex?

    下一篇: Possessive generic quantifier {m,n}+ not implemented in Ruby 1.9.3?