日期:2014-05-16  浏览次数:20451 次

JS 非贪婪模式详解
首先, 先理解下概念: 非贪婪模式 即在正则后加问号"?" 意义为按需匹配,
不明白, 我们先往下看

共用函数:
// 即为字符串高亮为红色
function hightlight(str){
    return "<font color=red>"+str+"</font>";
}


1. 首先, 正常使用如下(贪婪模式)
var reg = new RegExp('(a+)'); // a+为 一到多个a匹配
var str = 'aaa';
var newstr = str.replace(reg, hightlight);
document.write(newstr + "<br/>"); 

输出: aaa

注: 以上代码等同于:
var reg = new RegExp('(a+)'); // a+为 一到多个a匹配
var str = 'aaa';
var newstr = str.replace(reg, "<font color=red>$1</font>"); //$1 表示正则中匹配括号内的内容的第一个
document.write(newstr + "<br/>"); 


2. 同样是上边的例子, 我们使用非贪婪模式
var reg = new RegExp('(a+?)'); // 加上?号后为非贪婪模式, 即匹配完成即返回, 不继续
var str = 'aaa';
var newstr = str.replace(reg, hightlight);
document.write(newstr + "<br/>"); 

输出: aaa

3. 非贪婪模式中应注意:
正则是从左到右开始匹配所有项, 直到匹配为止, 那么
如下, 它匹配的就应该是整段字符, 而不是单独的一个b
var reg = new RegExp('(a*?b)');
var str = 'aaab';
var newstr = str.replace(reg, hightlight);
document.write(newstr);  

输出: aaab