正则的特性:
1.贪婪性:所谓贪婪性,就是正则在捕获时,会一次尽可能多地捕获符合条件的内容。如果我们想要尽可能少地去捕获符合条件的内容的话,可以在量词元字符后加?
2.懒惰性:正则在捕获一次后不管后面有没有符合条件的都不会再去捕获;捕获所有符合条件内容用 全局标志g
var str='123aaa456';
var re=/\d+/;//只捕获一次。一次尽可能多地捕获
var res=str.match(re);
console.log(res);//['123',index:0,input:'123aaa456']
re=/\d+?/g;//解决贪婪性、懒惰性
res=str.match(re);
console.log(res);//['1','2','3','4','5','6']
零宽断言:
用于查找在某些内容(不包括这些内容)之前或之后的东西,如\b,^,$,这样用于指定一个位置,这个位置应该满足一定的条件(即断言)
在使用正则表达式时,捕获的内容前后必须是特定的内容,而我们又不想捕获这些特定内容的时候,零宽断言就可以派上用场了。
1.零宽度正预测先行断言(?=exp)
2.零宽度负预测先行断言(?!exp)
3.零宽度正回顾后发断言(?<=exp)
4.零宽度负回顾后发断言(?
1.(?=exp)就是字符出现的位置的右边必须匹配到exp这个表达式
例:
var str='i'm singing and dancing';
var re=/\b(\w+(?=ing\b))/g;
var res=str.match(re);
console.log(res);//['sing','danc']
注:这里指的是位置,不是字符
var str = 'abc';
var reg = /a(?=b)c/;
console.log(res.test(str));
这个看起来似乎是正确的,实际上结果是false
原因:reg中a(?=b)匹配字符串'abc' 字符串a的右边是b这个匹配没问题,接下来reg中a(?=b)后边的c匹配字符串时是从字符串'abc'中位置a的后边b的前边的这个位置开始匹配的,这个相当于/ac/匹配'abc',显然结果是false了
2.(?!exp) 这个就是说字符出现的位置的右边不能是exp这个表达式。
var str = 'nodejs';
var reg = /node(?!js)/;
console.log(reg.test(str)) // false
3.(?<=exp) 这个就是说字符出现的位置的前边是exp这个表达式。
var str = '¥998$888';
var reg = /(?<=\$)\d+/;
console.log(reg.exec(str)) //888
4.(?位置的前边不能是exp这个表达式。
var str = '¥998$888';
var reg = /(?
常见正则例子:
1.去掉空格:
var str = ' hello ';
alert( '('+trim(str)+')' );//为了看出区别所以加的括号。 (hello)
function trim(str){
var re = /^\s+|\s+$/g; // |代表或者 \s代表空格 +至少一个 前面有至少一个空格 或者后面有至少一个空格 且全局匹配
return str.replace(re,''); //把空格替换成空
}
2.判断一个字符串中出现次数最多的字符,并统计次数
var str = 'abbbbAAbcBCCccdaACBDDabcccddddaab';
str = str.toLowerCase().split('').sort(function(a,b){return a.localeCompare(b)}).join('');
var reg = /(\w)\1+/ig;
var maxStr = '';
var maxLen = 0;
str.replace(reg,function($0,$1){
var regLen = $0.length;
if(regLen>maxLen)
{ maxLen = regLen; maxStr = $1; }
else if(maxLen == regLen)
{ maxStr += $1; } });
console.log(`出现最多的字母是${maxStr},共出现了${maxLen}次`)
3.千分位分隔符
function thousandBitSeparator(num) {
return num && (num
.toString().indexOf('.') != -1 ? num.toString().replace(/(\d)(?=(\d{3})+\.)/g, function($0, $1) {
return $1 + ",";
}) : num.toString().replace(/(\d)(?=(\d{3}))/g, function($0, $1) {
return $1 + ",";
}));
}
console.log(thousandBitSeparator(1000));
4.让2013-6-7 变成 2013.6.7
var str = '2013-6-7';
var re = /(\d+)(-)/g;
str = str.replace(re,function($0,$1,$2){
//replace()中如果有子项,
//第一个参数:$0(匹配成功后的整体结果 2013- 6-),
// 第二个参数 : $1(匹配成功的第一个分组,这里指的是\d 2013, 6)
//第三个参数 : $2(匹配成功的第二个分组,这里指的是 - - )
return $1 + '.'; //分别返回2013. 6.
});
alert( str ); //2013.6.7
//整个过程就是利用子项把2013- 6- 分别替换成了2013. 6. 最终弹出2013.6.7