javaScript——正则表达式进阶练习
分组
在正则表达式中还提供了一种将表达式分组的机制,当使用分组时,除了获得整个匹配。还能够在匹配中选择每一个分组。
要实现分组很简单,使用()即可。
分组有一个非常重要的功能——捕获数据。所以()
被称为捕获分组,用来捕获数据,当我们想要从匹配好的数据中提取关键数据的时候可以使用分组。
(\d{4})
和 (\d{7})
就分别捕获了两段数据:
- 0731
- 8825951
/<div>(.*?)</div>/
<div>hi</div> 需要提取的 hi
提取p标签中的数据
<p>(.*?)</p>
提取学号
些学校的学号是由多个关键信息组成的
例如:2019-5013-08 2019表示入学年份,5013表示班级代码,08表示班级中的排序。
接下来请你编写正则表达式匹配不同格式的学号,并将其中的关键信息用分组提取出来,需要分成三个分组。
(\d{4}).*(\d{4}).*(\d{2})
提取年月日
(\d{4})-?\/?(\d+)-?\/?(\d+)
或者条件
使用分组的同时还可以使用 或者(or)条件。
例如要提取所有图片文件的后缀名,可以在各个后缀名之间加上一个 |符号:
(.avi|.mp4|.wmv|.rmvb)
非捕获分组(?:表达式)
有时候,我们并不需要捕获某个分组的内容,但是又想使用分组的特性。
这个时候就可以使用非捕获组(?:表达式)
,从而不捕获数据,还能使用分组的功能。
例如想要匹配两个字母组成的单词或者四个字母组成的单词就可以使用非捕获分组:
(?:.{2}|.{3}|.{4}|.{5})-?\:?(\d{5})
非贪婪匹配
(?:.{2,5}?)-?\:?(\d{5})
分组使用技巧
日期可以有很多格式,例如:
20200102
2020-01-02
2020-1-2
2020.01.02
2020 01 02
2020 1 2
2020/01/02
现在我们想要使用正则表达式将其中的年月日全都提取出来。
可以发现他们唯一的区别就在于分隔符和月份与日期,这个时候可以使用[]
来匹配多种情况。
通过(\d{4})[-./\s]?(\d{1,2})[-./\s]?(\d{1,2})
就可以从文本中将年月日分别提取出来了。
虽然这段正则表达式看起来内容挺多,但是还是很容易理解的,[-./\s]
表示匹配三个可能出现的分隔符-./和空白,?表示匹配它们0次或者1次,其他年月日的数据使用\d{N}与分组结合就可以提取到目标数据。
(\d{4})[\-\.\s\/]?(\d{1,2})[\-\.\s\/]?(\d{1,2})
提取所有电话号码
[\(]?(\d{3})[\)]?[\\.\s\-]?(\d{1,3})[\-\.\s\-]?(\d{1,4})
分组的回溯引用
正则表达式还提供了一种引用之前匹配分组的机制,有些时候,我们或许会寻找到一个子匹配,该匹配接下来会再次出现。
例如,要匹配一段 HTML 代码,比如:0123<font>提示</font>abcd
,可能会编写出这样一段正则表达式:
如果想让后面分组的正则和第一个分组的正则匹配同样的数据该如何做呢?
可以使用分组的回溯引用,使用\N可以引用编号为N的分组,因此上述例子的代码我们可以改为:
接下来请你编写代码匹配符合 ab ba
这种关系的单词
(\w)(\w).*(\2)(\1)
回溯引用的实践
请编写正则表达式匹配下列有重复的数据:
(\w{2,4}?)\1
正向先行断言/后置肯定断言
很多人也称先行断言和后行断言为环视,也有人叫预搜索,其实叫什么无所谓,重要的是知道如何使用它们!
先行断言和后行断言总共有四种:
- 正向先行断言
- 反向先行断言
- 正向后行断言
- 反向后行断言
正向先行断言:(?=表达式
),指在某个位置向右看,表示所在位置右侧必须能匹配表达式
例如:我喜欢你 我喜欢 我喜欢我 喜欢 喜欢你
如果要取出喜欢
两个字,要求这个喜欢
后面有你
,这个时候就要这么写:喜欢(?=你)
,这就是正向先行断言。
(?=.*?[a-z])(?=.*?[A-Z]).+
这段正则表达式规定了匹配的字符串中必须包含至少一个大写和小写的字母。
密码强度验证
现在请你编写正则表达式进行密码强度的验证,规则如下:
至少一个大写字母
至少一个小写字母
至少一个数字
至少8个字符
(?=.*?[a-z])(?=.*?[A-Z]).{8}
反向先行断言/后置否定断言
反向先行断言(?!表达式)
的作用是保证右边不能出现某字符。
例如: 我喜欢你 我喜欢 我喜欢我 喜欢 喜欢你
如果要取出喜欢两个字,要求这个喜欢后面没有你,这个时候就要这么写:喜欢(?!你)
,这就是反向先行断言。
排除邮箱
编写正则表达式匹配不是qq邮箱的数据。
\w+@(?!qq)
匹配标签
编写正则表达式匹配除<p>或</p>
之外的所有标签。
<(?!p).+></(?!p).+>
正向后行断言/前置肯定断言
记住一句话:先行断言和后行断言只有一个区别,
即先行断言从左往右看,后行断言从右往左看。
正向后行断言:(?<=表达式)
,指在某个位置向左看,表示所在位置左侧必须能匹配表达式
例如:如果要取出喜欢
两个字,要求喜欢
的前面有我
,后面有你
,这个时候就要这么写:(?<=我)喜欢(?=你)
。
匹配王姓同学的名字
使用正则表达式匹配匹配王姓同学的名字。
(?<=王).+
反向后行断言/前置否定断言
反向后行断言:(?<!表达式)
,指在某个位置向左看,表示所在位置左侧不能匹配表达式
例如:如果要取出喜欢
两个字,要求喜欢的前面没有我,后面没有你
,这个时候就要这么写:(?<!我)喜欢(?!你)。
匹配一个美元符号中的数据
(?<!\$)\$([^\$]+)\$(?!\$)
匹配两个美元符号中的数据
^\$\$(?!\$).*\$\$
实践:提取所有人的生日
(?<=[.年\-])(\d{1,2})(?=[.月\-])[.月\-](\d{1,2})
实践:匹配所有的小数
^\d+\.(\d+)(?!.)
javaScript——正则表达式进阶练习相关推荐
- JavaScript正则表达式快速判断技巧
原文:JavaScript正则表达式快速判断技巧 这里是JS的正则的一点心得,并不是最完整的规则汇总,更侧重实际运用中的快速判断,初学者接触正则之后往往会被一堆星号括号给弄晕,有了一些速判技巧就能从整 ...
- javascript 正则表达式详解
正则表达式中的特殊字符 字符 含意 \ 做为转意,即通常在"\"后面的字符不按原来意义解释,如/b/匹配字符"b",当b前面加了反斜杆后/\b/,转意为匹配一个 ...
- 经典JavaScript正则表达式实战
来源:http://www.cainiao8.com/web/js_note/js_regular_expression_blueidea.html 目录 1. 正则表达式实战...1 2. 匹 ...
- 温故知新 javascript 正则表达式
温故知新 javascript 正则表达式 转载:http://www.cnblogs.com/libinqq/archive/2008/07/31/1257699.html 很长时间没看 正则表达式 ...
- javascript正则表达式小结
总结了一下javascript正则表达式的内容.表格形式,一目了然.辅以Example图形解释. 一.元字符 二.反义字符 三.转义字符 四.重复匹配 五.分组/捕获 六.贪婪与惰性 七.修饰符 ex ...
- JavaScript正则表达式详解(一)正则表达式入门
JavaScript正则表达式是很多JavaScript开发人员比较头疼的事情,也很多人不愿意学习,只是必要的时候上网查一下就可以啦~本文中详细的把JavaScript正则表达式的用法进行了列表,希望 ...
- 好程序员web前端分享使用JavaScript正则表达式如何去掉双引号
为什么80%的码农都做不了架构师?>>> 好程序员web前端分享使用JavaScript正则表达式如何去掉双引号,最近接了一个项目,项目需求需要用js正则表达式过滤掉页面文本域 ...
- JavaScript 正则表达式
JavaScript 正则表达式 版权声明:未经授权,严禁转载! 正则表达式 什么是正则表达式 正则表达式是用来描述一种特定格式的字符规则的表达式. 正则表达式常用语在一段文本中搜索,匹配或者替换特 ...
- js php 正则差别,JavaScript正则表达式的浏览器的差异
JavaScript中的正则表达式在不同的浏览器中得到的结果可能会有差异,下面把正则表达式在五大主流浏览器(IE.Firefox.Chrome.Safari.Opera,以当前版本为准)之间的差异整理 ...
最新文章
- 命名实体识别_用膨胀卷积进行命名实体识别 NER
- 浅读《视觉SLAM十四讲:从理论到实践》--操作1--初识SLAM
- Grid++Report问题集!
- excel匹配_Excel中的数据匹配和查找
- C库函数—strcpy实现
- 说三件切身利益的大事!一定要看 减少损失
- Android save pictrue by SQLiteOpenHelper
- Tomcat中设置数据源和连接池
- Java设计模式--策略模式
- 给 Python 开发者的四条忠告!| CSDN 博文精选
- python公众号留言功能_Python实现的微信公众号群发图片与文本消息功能实例详解...
- 发现一本好书--《Windows用户态程序高效排错 》
- windows关闭端口方法
- postgresql 9.5 now()函数少8小时
- 最全的关于硬件测试的解读
- java开发app_使用java制作app教程
- Love to be loved by you Just one last dance
- 用html2canvas长按保存h5页面,html2canvas - 微信中长按存图 - 将h5活动结果保存到本地...
- Goland 1.15运行报错:该版本的 %1 与你运行的 Windows 版本不兼容
- 【NOI2006】 生日快乐
热门文章
- H265码流分析详解
- Fabric 1.0源代码分析(37) Peer #DeliverClient(Deliver客户端)
- 就10.23网络沙龙会议的一些问题谈谈我自己的看法
- android webview vr,如何使用krpano在WebView上启用WebVR?
- Python数字转人民币读法
- 【实战】FaceNet 人脸识别模型- 彭于晏和邓超人脸像吗
- 飞桨领航团表彰来了!
- 机器学习之数学原理笔记(四)
- 开放形成考核计算机应用,(2016年电大)计算机应用基础-形成性考核册.docx
- iphone ios AV Foundation