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

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

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

二、正则表达式常见坑

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”这样的字符串

时间: 2024-08-07 21:19:41

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

APP测试走过的那些坑

我现在的工作有一大部分也是app测试,虽然自己是app开发出身,但是在测试上还是跌入了很多大坑,毕竟二者还是有很大不同,所处的角度也是不一样的.而开发转测试中,我认为较难的也是一个角度的转换,以一个开发者的角度去测试,往往会忽略很多问题. 在记录app测试走过的那些坑之前,先总结下app测试的工作主要有哪些. 1.功能测试,无论是什么软件产品,必不可少的就是功能测试.我们需要测试这款app产品的功能是否完善,是否符合客户需求,是否符合用户正常体验.而功能测试最重要的一点也是测试案例的设计,这个抽

java正则表达式的坑

java中正则表达式比较有意思,这里列举几个常见的坑 1.[]符号,中括号表示其中的数据都是或的关系 如果[\\w+]是匹配条件 abc是否可以匹配的到呢? 首先\\w表示a-z A-Z 0-9 _多个字符组合,显然abc任意一个在里面的,后又有+号,表示有多个字符,所以abc可以匹配\\w+ 但是[\\w+]表示的意思是多个字符的或,注意是或,所以[\\w+]等同于[a-z|A-Z|0-9|_],这里面的或只有单个字符 所以a或者b或者c都可以匹配[\\w+],但是abc不可以,如何让abc可

那些年我们踩到过的坑(一):为ThreadPoolExecutor 指定RejectedExecutionHandler需要注意的坑

昨天下午公司的短信发送服务挂掉,查日志发现有些短信服务提供商的服务器time out.马上联系对方,确认服务已经恢复正常,我们立马重启服务,恢复正常. 我们的短信服务是起一个线程T1从redis list去拿消息,然后创建一个发送短信的任务线程扔到线程池里执行,每一个发送短信的任务都会连接服务商的服务,time out就是从这里抛出来的,可是连接time out怎么能导致我们的服务挂掉呢? 还好当时做了thread dump,分析了下dump 文件,发现线程T1挂掉了,看代码发现该线程的run方

那些年我们一起踩过的坑

总会有些坑,踩过了还想再踩. 比较int大小时,如果简单的使用 a - b > 0来判断会很不安全.因为如果差值可能是int范围的两倍.如最大正数减最小负数.差值会溢出,截取低位.从而产生难以预见的错误. 字节流和它的包装流,只能被读取一次.读完一次后在读会读不到数据.两种方式解决:重置流和将流读出来缓存后重复使用. 原文地址:https://www.cnblogs.com/songjialin2016/p/8725180.html

搭建自动化上线walle--及走过的所有坑

这个walle真的是谁搭建,坑谁,他的坑真是有点多.进入正题:walleWalle 一个web部署系统工具,配置简单.功能完善.界面流畅.开箱即用!支持git.svn版本管理,支持各种web代码发布,PHP,Python,JAVA等代码的发布.回滚,可以通过web来一键完成.支持多项目.多环境一键部署上线,一键快速回滚. 正式搭建: 官网又文档,可参考 http://www.walle-web.io/docs/installation.html前提已搭建lnmp环境,此文档中用的是lnmp1.5

那些年我们踩到过的坑(二):3.1 版 MultiThreadedHttpConnectionManager 未releaseConnection导致应用服务器宕机

昨天短信服务又宕机了,jstack打出线程信息发现 所有线程池的线程都在wait,栈信息如下: at java.lang.Object.wait(Native Method) - waiting on [0x000000070754fb60] (a org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$ConnectionPool) at org.apache.commons.httpclient.MultiThread

OA系统走过的的坑之部门岗位管理

1.为什么查询全部岗位之后 输出的全部是null? 答:(1)第一肯定就没往数据库里走所以输出了 是null  就应该查看xml里面的sql语句  注意语句的id以及resultType还是resultMap (看看返回的是这个表吗)这个很重要 然后就是 sql语句了 2.前段页面的form表单 一定要对应上submit 3.浏览器上的乱码是因为你没有在页面修改内个 <%@ page contentType="text/html;charset=UTF-8" language=&

Android App引导页这些坑你自己犯过吗?

场景:測试机:华为荣耀6x 今天我自己掉入一个非常蠢蠢的坑,一个引导页搞了20多分钟.无论我怎么測试用真机还是模拟器都无法执行,可是我写的demo全然没问题,好无语,我都怀疑我是不是搞android,我去.一个简单的问题都不能解决?后来看了下自己真的傻逼了无语! 看下图 挖坑1 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMTU5NTAzMjU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dis

EDM模板编写踩坑指南(非响应式,纯table有源码)

如果问你table布局,你肯定会嗤之以鼻?什么table布局?不是早已经淘汰了吗?但是如果让你写EDM邮件模板,table布局相对来说是最好的选择. 如果让你立刻写EDM,你在网上搜的话,得到的信息相对较少,但是又很懵的话,建议你看看这篇文章,让你30分钟之内入门并开始写, 需要源码再私我吧~ 或许有人会问EDM是什么,Email Direct Marketing的缩写,即电子邮件营销.EDM模板就是你邮箱中的广告邮件,其实就是在邮件中写网页.但是EDM模板怎么书写.如果你在网上搜,或许你会搜到