正则表达式(补充)及常见例子

正则的特性:
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.零宽度负回顾后发断言(?<!exp)

 

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) 这个就是说字符出现的位置的前边不能是exp这个表达式。

var str = '¥998$888';
var reg = /(?<!\$)\d+/;
console.log(reg.exec(str)) //998

常见正则例子:
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

猜你喜欢

转载自blog.csdn.net/Q846169253/article/details/81624950