贪婪与非贪婪匹配模式原理

转载自http://blog.csdn.net/lxcnn/article/details/4756030
源字符串:aa

test1
bb
test2
cc
正则表达式一:
.*

匹配结果一:
test1
bb
test2

正则表达式二:
.*?

匹配结果二:
test1
(这里指的是一次匹配结果,所以没包括
test2

下面从匹配原理角度分析的匹配过程。


贪婪与非贪婪匹配模式原理_第1张图片
35916_1265676086dlqj.jpg

首先由“<”取得控制权,由位置0位开始尝试匹配,匹配字符“a”,匹配失败,第一轮匹配结束。第二轮匹配从位置1开始尝试匹配,同样匹配失败。第三轮从位置3开始尝试匹配,匹配字符“<”,匹配成功,控制权交给“d”。
“d”尝试匹配字符“d”,匹配成功,控制权交给“i”。重复以上过程,直到由“>”匹配到字符“>”,控制权交给“.”。
  “.
”属于贪婪模式,将从B处后的字符“t”开始,一直匹配到E处,也就是字符串结束位置,将控制权交给“<”。
  “<”从字符串结束位置尝试匹配,匹配失败,向前查找可供回溯的状态,把控制权交给“.”,由“.”让出一个字符“c”,把控制权再交给“<”,尝试匹配,匹配失败,向前查找可供回溯的状态。一直重复以上过程,直到“.*”让出已匹配的字符“<”,实际上也就是让出了已匹配的子串“

cc”为止,“<”才匹配字符“<”成功,控制权交给“/”。
接下来由“/”、“d”、“i”、“v”分别匹配对应的字符成功,此时整个正则表达式匹配完毕。

案例:

var str = 'The Quick Brown Fox Jumps Over The Lazy Dog The Fx Jumps Over The Lazy Dog'.match(/quick\s(brown).+(jumps)/ig)
["Quick Brown Fox Jumps Over The Lazy Dog The Fx Jumps"];
str.match(/quick\s(brown).+(jumps)/ig)
结果:["Quick Brown Fox Jumps Over The Lazy Dog The Fx Jumps"]

str.match(/quick\s(brown).+?(jumps)/ig)
结果:["Quick Brown Fox Jumps"]

你可能感兴趣的:(贪婪与非贪婪匹配模式原理)