惰性量词在这个特定的正则表达式中有什么不同?
我正在阅读有关正则表达式的具体示例/练习。
要处理的句子是:
<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>
和到底是一个小大于第一正则表达式的效率更高。
例如,您可以看到在获得以下项目的匹配之前所采用的“步骤”数量:
上一篇: What difference does the lazy quantifier make in this specific regex?
下一篇: Possessive generic quantifier {m,n}+ not implemented in Ruby 1.9.3?