正则表达的匹配模式包括了贪婪匹配,惰性匹配和支配性匹配。由于js中没有支配性匹配,所以这里我主要介绍一下前两者。
贪婪匹配:
表示方法:简单量词都是贪婪匹配。(? , * , +)
描述:贪婪匹配是先匹配整个字符串,匹配原则类似在正则表达式末尾加上$。如果匹配失败,则去掉最末位,重新进行上一个操作。直到匹配成功(这里需要进行最大量匹配,比如说/.*aa/,则会匹配到aa之前的所有字符,而不仅仅是aa之前第一个),如果是全局匹配,匹配成功之后还可以在此基础上继续进行匹配操作,或者是匹配失败。
示例:
var temArr = "abzbaabxbaaabcb12"; //(用网上比较流行的例子稍作变化来演示)
var regex = /.*b.{1}b/g;
var result = temArr.match(regex);
alert(result.length); //3
alert(result[0]); //abzb
alert(result[1]); //abxb
alert(result[2]); //abcb
下面演示一下具体的操作:
"abzbaabxbaaabcb12".match(/.?b.{1}b$/g) //null
"abzbaabxbaaabcb1".match(/.?b.{1}b$/g) //null
"abzbaabxbaaabcb".match(/.?b.{1}b$/g) //abcb(保存)
"abzbaabxbaaabc".match(/.?b.{1}b$/g) //null
"abzbaabxb".match(/.?b.{1}b$/g) //abxb(保存)
"abzbaabx".match(/.?b.{1}b$/g) //null
"abzb".match(/.?b.{1}b$/g) //abzb(保存)
值得注意的是,虽然演示中保存的顺序是从右到左abcb,abxb,abzb,但是输出顺序仍然是按照从左到右的顺序abzb,abxb,abcb
惰性匹配:
表示方法:在量词后面添加'?'。(?? , *? , +?)
描述:惰性匹配与贪婪匹配正好相反,是从左往右进行匹配。先匹配第一个字符(匹配方式与上面贪婪匹配一样,在正则表达式后面添加$),如果第一个数据匹配失败,则新添加一个字符。直到匹配成功,如果是全局匹配,匹配成功之后还可以在此基础上继续进行匹配操作。
示例:
var temArr = "abzbaabxbaaabcb12";
var regex = /.*?b.{1}b/g;
var result = temArr.match(regex);
alert(result.length); //3
alert(result[0]); //abzb
alert(result[1]); //aabxb
alert(result[2]); //aaabcb
下面演示一下具体的操作:
"a".match(/.*?b.{1}b$/g) //null
"abzb".match(/.*?b.{1}b$/g) //abzb(保存)
"a".match(/.*?b.{1}b$/g) //null
"aabxb".match(/.*?b.{1}b$/g) //aabxb(保存)
"a".match(/.*?b.{1}b$/g) //null
"aaabcb".match(/.*?b.{1}b$/g) //aaabcb(保存)