那些年我们一起走过正则表达式的坑

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了那些年我们一起走过正则表达式的坑相关的知识,希望对你有一定的参考价值。

一、为什么需要学习正则表达式

正则表达式是一种应用广,灵活度高的一种查找方式,目前在爬虫爬取,对特定的内容的抓包,登录的验证等多个方面都用得上正则表达式,但是由于其实一种灵活的查找,所以我们要付出的代价就是相应使用的复杂,复杂度表现在语法上的不便记忆和应用层面上的易出错,今天我们就来谈谈正则表达式在应用层面上常出现的错误

二、正则表达式常见坑

1、零宽断言理解错误

零宽断言匹配的相当于是一个位置,不是一个具体的内容

示例:

将字符串str="test.com"的.前面的替换为1,也就是str="1.com"

错误示范:

    var str="test.com";
    console.log(str);
    var reg=/(?=\.)*/gi;
    //var re=new RegExp(reg);
    str=str.replace(reg,"1");
    console.log(str);

运行结果是:str="1t1e1s1t1.1c1o1m",我想此时你的心情一定是这样的

技术分享

 从这个运行结果来看,就是在原来的字符串中的每个字符前面插入1,但是这个并不是我们所要求的,造成这样的原因主要是位置弄错了,现在把代码改为如下所示:

 

var str="test.com";
console.log(str);
var reg=/\w+(?=\.)/gi;
//var re=new RegExp(reg);
str=str.replace(reg,"1");
console.log(str);

 

这样运行一下就得到了我们所要求的,这个位置我们其实是要求:匹配类型+元字符+零宽断言,错误示范中是零宽断言+元字符这样的一种组合,根本不符合语法的要求,所以错误

 2、后向调用理解错误

示例

匹配字符串str="455 33"

错误示范

var str="455 33";
var test=/\b([1-4]\d{1,2})\s?\1\b/gi;
console.log(test.test(str));

这个错误主要的原因是对后向调用的理解有误,后向调用第n次使用时匹配第一次的完全相同的内容,但是不意味着在这里第二次引用前面分组的正则表达式,所以这里只匹配“455 455”这样的字符串

 技术分享

 

以上是关于那些年我们一起走过正则表达式的坑的主要内容,如果未能解决你的问题,请参考以下文章

一起学习正则表达式量词与贪婪

一起学习正则表达式正则匹配原理

一起学习正则表达式正则匹配原理

一起学习正则表达式正则匹配原理

一起学习正则表达式正则匹配原理

一起学习正则表达式断言匹配