问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

javascript进阶知识4-正则表达式

发布网友 发布时间:2024-09-05 23:11

我来回答

1个回答

热心网友 时间:2024-10-04 19:15

关于正则表达式,我收藏的一篇帖子讲得很好、很全,但是我没有学得很好,哈哈。

这里附上链接:https://blog.csdn.net/h610443955/article/details/81079439

(本文有部分直接借鉴的那篇文章的例子和文字)

1.正则表达式的创建

字面量:

letreg=/\d/g

对象形式:

letreg=newRegExp('\\d','g');console.log(reg)///\d/g

以上两种创建的表达式的等价的。用对象形式创建时,接收两个参数,第一个是字符串,第二个是修饰符。同时对象形式创建正则时,需要转义时,需要使用两个\。建议:多用字面量形式,少用对象形式。

2.原子表[]与选择符|与元字符(1)|选择符

与逻辑运算中的“或”差不多。

letstr='23a34';console.log(str.match(/a|33/))//['a']表示查找a或者33console.log(str.match(/ab|33/))//null表示查找ab或者33(2)原子表

[]就是纵向模糊匹配,纵向模糊指的是,一个正则匹配的字符串,具体到某一位字符时,它可以不是某个确定的字符,可以有多种可能。

其实现的方式是使用字符组。譬如[abc],表示该字符是可以字符“a”、“b”、“c”中的任何一个。

比如/a[123]b/可以匹配如下三种字符串:"a1b"、"a2b"、"a3b"。测试如下:

varregex=/a[123]b/g;varstring="a0ba1ba2ba3ba4b";console.log(string.match(regex));//=>["a1b","a2b","a3b"]

以上例子可以看出/[abc]/===/a|b|c/,他们都是惰性的,即匹配到第一个后就停止匹配了。

排除字符组

纵向模糊匹配,还有一种情形就是,某位字符可以是任何东西,但就不能是"a"、"b"、"c"。

此时就是排除字符组(反义字符组)的概念。例如[^abc],表示是一个除"a"、"b"、"c"之外的任意一个字符。字符组的第一位放^(脱字符),表示求反的概念。

当然,也有相应的范围表示法。

(3)元字符

是具有特殊含义的字符。

元字符描述\d[0-9]查找数字。\D[^0-9]查找非数字字符。\w[a-zA-Z0-9_]查找字母数字下划线。\W[^a-zA-Z0-9_]查找非字母数字下划线。\s[\t\v\n\r\f]表示空白符,包括空格、水平制表符、垂直制表符、换行符、回车符、换页符。\S[^\t\v\n\r\f]非空白符。.通配符,表示几乎任意字符。换行符、回车符、行分隔符和段分隔符除外。

使用[\s\S]和[\d\D]、[\w\W]可以匹配所有字符.

3.量词横向模糊匹配

横向模糊指的是,一个正则可匹配的字符串的长度不是固定的,可以是多种情况的。

其实现的方式是使用量词。譬如{m,n},表示连续出现最少m次,最多n次。

比如/ab{2,5}c/表示匹配这样一个字符串:第一个字符是“a”,接下来是2到5个字符“b”,最后是字符“c”。测试如下:

varregex=/ab{2,5}c/g;varstring="abcabbcabbbcabbbbcabbbbbcabbbbbbc";console.log(string.match(regex));//=>["abbc","abbbc","abbbbc","abbbbbc"]量词描述{m}等价于{m,m},表示出现m次。{m,}表示至少出现m次。{m,n}表示至少出现m次,最多出现n次。?等价于{0,1},表示出现或者不出现。+等价于{1,},表示出现至少一次。*等价于{0,},表示出现任意次,有可能不出现。3.贪婪匹配和惰性匹配varregex=/\d{2,5}/g;varstring="123123412345123456";console.log(string.match(regex));//["123","1234","12345","12345"]

其中正则/\d{2,5}/,表示数字连续出现2到5次。会匹配2位、3位、4位、5位连续数字。

但是其是贪婪的,它会尽可能多的匹配。你能给我6个,我就要5个。你能给我3个,我就要3个。反正只要在能力范围内,越多越好。

我们知道有时贪婪不是一件好事。而惰性匹配,就是尽可能少的匹配:

lethd='hdddd';console.log(hd.match(/hd+/));//['hdddd']console.log(hd.match(/hd+?/));//['hd']console.log(hd.match(/hd*?/));//['h']console.log(hd.match(/hd{1,3}?/));//['hd']console.log(hd.match(/hd??/));//['h']

其中/hd{1,3}?/表示,虽然1到3次都行,当1个就够的时候,就不在往下尝试了。

通过在量词后面加个问号就能实现惰性匹配,因此所有惰性匹配情形如下:

{m,n}?匹配m个{m,}?匹配m个??匹配0个+?匹配1个*?匹配0个

4.修饰符

g是全局查找

i是不区分大小写

m多行匹配多行匹配,只影响^和$,二者变成行的概念,即行开头和行结尾。

lethd='houdunren'console.log(hd.match(/u/));//['u',index:2,input:'houdunren',groups:undefined]console.log(hd.match(/u/g));//['u,'u']lethd='HelloWorld!'console.log(hd.match(/h/));//nullconsole.log(hd.match(/h/i));//['H',index:0,input:'HelloWorld!',groups:undefined]letstr="abcggab\nabcoab";console.log(str.match(/^abc/g));//['abc']console.log(str.match(/^abc/gm));//结果为:["abc","abc"]console.log(str.match(/ab$/g));//['ab']console.log(str.match(/ab$/gm));//结果为:["ab","ab"]

match返回的一个数组,但是加没加修饰符g返回值是有区别的,没有加g,返回的数组第一个元素是整体匹配结果,然后是各个分组(括号里)匹配的内容,然后是匹配下标,最后是输入的文本。加g后,返回的数组是全是匹配结果。

5.正则表达式位置匹配

正则表达式是匹配模式,要么匹配字符,要么匹配位置。

5-1.什么是位置呢?

位置是相邻字符之间的位置。比如,下图中箭头所指的地方:

5-2.如何匹配位置呢?

在ES5中,共有6个锚字符:

^?$?\b?\B?(?=p)?(?!p)

ES6新增了两个

(?<=)?(?<!)

(1)^和$

^(脱字符)匹配开头,在多行匹配中匹配行开头。

$(美元符号)匹配结尾,在多行匹配中匹配行结尾。

letstr='sdasdf324'console.log(str.match(/^[a-z]+/));//匹配以字母开头的//['sdasdf',index:0,input:'sdasdf324',groups:undefined]console.log(str.match(/\d+$/));//匹配以数字结尾的//['324',index:6,input:'sdasdf324',groups:undefined]

(2)\b与\B

\b是单词边界,具体就是\w和\W之间的位置,也包括\w和^之间的位置,也包括\w和$之间的位置。

\B就是\b的反面的意思,非单词边界。例如在字符串中所有位置中,扣掉\b,剩下的都是\B的。

(3)(?=p)和(?!p)、(?<=)和(?<!)断言

断言相当于if语句(?=)一般是写在后面,表示判断后面是否符合,符合就匹配(表示后面是什么);(?<=)一般写在前面,表示前面是否符合,符合就匹配(表示前面是什么)(?!)一般写在后面,表示判断后面是否符合,不符合就匹配(表示后面不是什么);(?<!)一般写在前面,表示前面是否符合,不符合就匹配(表示前面不是什么)

letusers=`老板电话:12345678910员工电话:98765432101`letreg=/(?<=\d{7})\d{4}/giusers=users.replace(reg,v=>{return'*'.repeat(4)})console.log(users);//老板电话:1234567****员工电话:9876543****

/(?<=\d{7})\d{4}/gi的意思是存在七位数字后面的四位数字

6.原子组分组()

6.1分组

我们知道/a+/匹配连续出现的“a”,而要匹配连续出现的“ab”时,需要使用/(ab)+/。

其中括号是提供分组功能,使量词+作用于“ab”这个整体,测试如下:

letreg=newRegExp('\\d','g');console.log(reg)///\d/g0

6.2分支结构

而在多选分支结构(p1|p2)中,此处括号的作用也是不言而喻的,提供了子表达式的所有可能。

比如,要匹配如下的字符串:

IloveJavaScriptIloveRegularExpression

可以使用正则:

letreg=newRegExp('\\d','g');console.log(reg)///\d/g1

如果去掉正则中的括号,即/^IloveJavaScript|RegularExpression$/,匹配字符串是"IloveJavaScript"和"RegularExpression",当然这不是我们想要的。

6.3.引用分组和反向引用和非捕获分组

这个大家就去看我分享的文档吧,那个写的挺详细的。哈哈

7.exec()和test()方法

前面的match()、search()、replace()都是字符串的方法,但是exec()和test()是正则的方法。

exec比match更强大当正则没有g时,使用match返回的信息比较多。但是有g后,就没有关键的信息index了。

而exec方法就能解决这个问题,它能接着上一次匹配后继续匹配:

letreg=newRegExp('\\d','g');console.log(reg)///\d/g2

其中正则实例lastIndex属性,表示下一次匹配开始的位置。

比如第一次匹配了“2017”,开始下标是0,共4个字符,因此这次匹配结束的位置是3,下一次开始匹配的位置是4。

从上述代码看出,在使用exec时,经常需要配合使用while循环:

letreg=newRegExp('\\d','g');console.log(reg)///\d/g3

修饰符g,对exex和test的影响

而正则实例的两个方法exec、test,当正则是全局匹配时,每一次匹配完成后,都会修改lastIndex。下面让我们以test为例,看看你是否会迷糊:

letreg=newRegExp('\\d','g');console.log(reg)///\d/g4

注意上面代码中的第三次调用test,因为这一次尝试匹配,开始从下标lastIndex即3位置处开始查找,自然就找不到了。

如果没有g,自然都是从字符串第0个字符处开始尝试匹配:

letreg=newRegExp('\\d','g');console.log(reg)///\d/g5

test整体匹配时需要使用^和$

这个相对容易理解,因为test是看目标字符串中是否有子串匹配正则,即有部分匹配即可。

如果,要整体匹配,正则前后需要添加开头和结尾:

letreg=newRegExp('\\d','g');console.log(reg)///\d/g68.批量使用正则

对于复杂的字符串,我们可以批量使用正则进行匹配。

letreg=newRegExp('\\d','g');console.log(reg)///\d/g7原文:https://juejin.cn/post/7098337533209575460
正则表达式进阶--玩转分组、前瞻和后顾

正则表达式是强大的文本匹配工具,用于字符串查找、替换和提取特定文本。分组是核心功能,允许将模式分组操作。前瞻和后顾是高级技术,能更精确控制匹配过程。本文详解正则表达式的分组、前瞻、后顾,通过JavaScript示例,深入理解这些概念。基础语法包括元字符和字符类别,如\d、\w、\s,量词如*、+、?。分...

学习正则表达式有哪些入门和进阶的书籍

一、入门 《Java 2从入门到精通》- 推荐 《Thinking in Java》- 强烈推荐* O’reilly的Java编程基础系列 - 参考* 二、进阶 《Java Cook Book》- 非常推荐* (包含了Java编程的Tips,适合当做手册来查阅)

如何从事专业级ChromeOSApp开发

Js基础教程、js内置对象常用方法、常见DOM树操作大全、ECMAscript、DOM、BOM、定时器和焦点图。JS基本特效:常见特效、例如:tab、导航、整页滚动、轮播图、JS制作幻灯片、弹出层、手风琴菜单、瀑布流布局、滚动事件、滚差视图。JS高级特征:正则表达式、排序算法、递归算法、闭包、函数节流、作用域链、基于...

web前端需要学什么?

4、使用HTML、CSS、LESS、SASS等技术完成网页项目实战。通过项目掌握第一阶段html、css的内容、完成PC端页面设计和移动端页面设计。第二阶段:Web后台技术 阶段目标:1. 了解JavaScript的发展历史、掌握Node环境搭建及npm使用。2. 熟练掌握JavaScript的基本数据类型和变量的概念。3. 熟练掌握JavaScript中的运算...

想学软件测试,做软件测试员需要学什么?自学如何去学

2. 编程语言和脚本语言:掌握至少一门编程语言(如Java、Python)和常用的脚本语言(如JavaScript),这将帮助您自动化测试和编写测试脚本。3. 测试工具和框架:熟悉并学习使用常见的软件测试工具和框架,如Selenium、Junit、TestNG等。掌握这些工具和框架可以提高测试效率和质量。4. 数据库和SQL语言:了解...

学完了c,c++,java,html,css,javascript,J2SE,J2EE还可以学啥提高自己的...

3. 对设计模式有所了解之后,可以多看一些优秀的开源源码。对自己的水平、眼界有很大的提高。4. 有机会适当看看敏捷开发相关的书籍,同时对正规的需求分析文档、系统设计文档、测试文档的写法研究一下。这是实际项目开发工作中必不可少的内容,不要总是野路子开发。5. 对项目管理的知识逐渐有所涉猎。满...

web前端需要哪些技术?

首先,我们需要一定的理论知识,不管是你听别人讲授、自己看书还是网上淘资料,你都需要一定的理论知识,每一种程序开发,都避免不了。 第二,有了这些理论知识我们就可以编码了——不错——but,没有人能抵挡住第三方框架和类库的诱惑,例如jquery; 第三,有了这些理论知识和协助我们的类库框架,我们就可真正的编码了。大...

Ph学习路线图大学生必看

4)函数高级应用:熟练使用函数的调用等 5)正则表达式:熟练运用re模块的各种方法 6)数据库:关系型数据库、非关系型数据库、MySQL 7)Python语法进阶:闭包、装饰器、生成器、迭代器 8) mini-web服务器:根据网络服务的过程写出简易的web服务器 9) mini-web框架:可以编写简易的web服务器框架 03前端开发 ...

软件测试找工作都需要什么技能呢?刚毕业好找工作吗?

1. 熟练掌握IT核心技术:编程,数据库,操作系统,版本控制 2. 能够熟练运用所学技术搭建各类服务器环境 3. 深入理解软件研发过程各种疑难杂症及处理手段 4. 掌握Python编程技术并熟练运用Python进行程序设计 知识点:1、Web页面元素,布局,CSS样式,盒模型,JavaScript程序设计,函数,基础算法,正则表达...

求推荐一个web前端的学习路线

web前端学习顺序:①计算机基础以及PS基础 ②前端开发基础(HTML5开发、JavaScript基础到高级、jQuery网页特效、Bootstrap框架)③移动开发 ④前端高级开发(ECMAScript6、Veu.js框架开发、webpack、前端页面优化、React框架开发、AngularJS 2.0框架开发等)⑤小程序开发 ⑥全栈开发(MySQL数据库、Python编程语言...

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
作为健身达人,你怎么能只知道吃鸡蛋 迷雾剧场再出新作 八角亭谜雾》表现如何 专利著作权不可以转让吗 我骑自行车被小气车撞了下,小汽车全责,有事故认定,我有一根利骨骨_百度... 怎么摆脱已分手男人的纠缠 东莞东站到东莞体育管怎么走 东莞市莞太路34号联丰工业区是在南城区吗? 哪个软件免费下载的网站最好呢? update语句SQL问题 sql2000,将表1与表2相同字段的数据找出来,并更新表1的字段 javascript要学什么? javascript有哪些方面的知识? 兽皮痣右胳膊小臂长有黑色毛发胎记,哪家医院治疗最专业?【兽皮痣... 沈丘县胎记医院脸上有一点五分硬币那么大手术费多少钱 祛除面部胎记多少钱 有首歌里面有一句(几千年礼仪之帮)叫什么名字? ...其中有两句歌词是:五千年礼仪之邦,泱泱我大中华,天是坤,地是... 描写泉水的好段? 唯物主义是什么意思呀 唯物主义的意思 黄柏煮水的功效与作用 黄柏的功效与作用是什么 吕继宏出版专辑 离婚判决之后还能再起诉吗? 两次起诉离婚没有判离还能起诉吗? 判决不准离婚之后还能起诉离婚吗 甘肃定西人去深州需要隔离吗? 2022进出深圳最新规定:深圳现在可以自由出入吗 深圳建筑资质二级升一级办理要求和注意的问题 深圳有哪些补贴 new关键字相关知识点总结 前端基石:面向对象的细节知识(较长) javascript和web的关系(javaweb和javascript) javascript中的作用域和执行上下文 JavaScript数组操作必须熟练运用的10个方法 JavaScript之彻底理解原型与原型链 哈密瓜怎么去皮切块 哈密瓜怎么削皮 哈密瓜削皮方法 什么是肥厚型心肌病?可怕吗? 肥厚型心肌病临床上的特点 肥厚型心肌病的鉴别方法 肥厚型心肌病临床表现 肥厚型心肌病心脏彩超的表现 关于《琼明神女录》 底特律大都会国际机场简介 工作超十年被公司降职降薪,又唔出书面通知,只是收到口头通知,如何是好... ...口头通知降职降薪 然后公司又不出书面通告 这怎么办? 给老人送礼应该考虑哪些问题? 给老人送什么礼物比较好啊? 给80岁老人买礼物送什么好?