javascript - JS关于正则的非贪婪模式
阿神
阿神 2017-04-11 09:10:56
0
2
365

如题,既然正则的非贪婪模式是匹配少的字符,如下代码:

<script type="text/javascript">
            var a="fooood";
            var d=/(fo+?)/g;
            console.log(a.match(d));
        </script>

这样的话是说明o后面最少匹配,所以出现就会匹配fo,

疑问是下面的代码:

<script type="text/javascript">
            var a="aabab";
            var d=/(a*?b)/g;
            console.log(a.match(d));
        </script>

既然a是最少匹配,那么不应该匹配的是ab,ab么,为什么最后结果是aab;ab,希望帮忙解答一下,我理解上的错误,谢谢

阿神
阿神

闭关修行中......

全員に返信(2)
巴扎黑

为什么第一个匹配是aab(第一到第三个字符)而不是ab(第二到第三个字符)?简单地说,因为正则表达式有另一条规则,比懒惰/贪婪规则的优先级更高:最先开始的匹配拥有最高的优先权——The match that begins earliest wins。
——摘自《正则表达式30分钟入门教程》

いいねを押す +0
阿神

首先正则是很复杂,很巧妙的。

你举的这个例子说明贪婪模式和非贪婪模式是不对的。
啥是贪婪模式,和非贪婪模式?
贪婪模式,就是“贪得无厌”,有了还要,有多少要多少,指导没有(字符串尾)。
非贪婪模式,恰好相反,匹配了就不要了,就得到结果。

我先举一个例子来说明,贪婪模式和非贪婪模式,只在你的基础上稍稍改动,为了后面对比说明。

var str='aabab';
var reg=/a.*b/g;
var res=str.match(reg);
console.log(res);

注意,比你那个多了一个".",表示任意字符。
上面这个是贪婪模式,a和b之间可以有任意字符,他一直“贪婪”找到了最后一个b,得到的结果是: aabab

现在来看,非贪婪模式:

var str='aabab';
var reg=/a.*?b/g;
var res=str.match(reg);
console.log(res);

得到的结果是["aab","ab"],找到一组匹配就找第二组(这里使用了g的)。

再回过头来看你的
首先分析你正则表达式,表示匹配内容为:任意个a,末尾是b(注意中间不能是其他字符,只能是a)。
得到的结果是:["aab","ab"]。
你的意思是,应该得到aabab,但是实际情况是,你的正则要的有任意a(不能有b),试问它怎么继续匹配得到aabab呢。
所以说,用你举的例子来说明贪婪模式和非贪婪模式是不对的。
你没有先从正则表达式本身去分析,而是一心扑在了对贪婪模式和非贪婪模式的理解上去了。

理解了上面的,再来看这个,我想就应该明白了:

贪婪模式:

var str="baaaa";
var reg=/ba*/g;
var res=str.match(reg);
console.log(res);//["baaaa"]

var str="baaaa";
var reg=/ba+/g;
var res=str.match(reg);
console.log(res);//["baaaa"]

非贪婪模式:

var str="baaaa";
var reg=/ba*?/g;
var res=str.match(reg);
console.log(res);//["b"]

var str="baaaa";
var reg=/ba+?/g;
var res=str.match(reg);
console.log(res);//["ba"]
いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート