主要讲解正则表达式的分组、回溯与断言。
分组
分组实现起来很简单,使用()
即可。
可以捕获一个分组:把多个标记分在同一组并创建一个捕获分组,用来创建子串或者引用。
举例:提取标签中的内容
提取学号:
另外将*
替换为?
也可以:
提取年月日
或者条件
在分组的同时可以使用或者条件。使用|
完成。
和逻辑或相似,匹配|
前面的或后面的表达式。
eg:匹配指定的图片格式:
非捕获分组
可以不捕获数据,也能使用分组的功能。
由于捕获分组会将匹配的内容存储在内存中供后续引用,而非捕获分组不会将其内容存储在内存中。所以如果不想将匹配的内容存储在内存中时,非捕获分组就会有更好的性能。
回溯引用
比如,我们有时要匹配一段html代码,如果不使用回溯引用,我们会这样写:
/<\w+>.*</\w+>/g
但是如果把</font>
改</bar>
,利用上述方法依然可以匹配上,但是我们想要的结果是不匹配</bar>
。
解决方案:使用回溯引用。当引用第一个分组内容,使用\1
来引用。(排列顺序从1开始)。
断言
先行断言
正向先行断言
使用(?=表达式)
的格式,就是从某个位置往右看,所在位置右侧必须能够匹配表达式,但是不包括在结果中。
例子:提取喜欢两个字,要求喜欢后面必须有你。
/喜欢(?=你)/g
这个可以用来验证字符串中是否同时具备大写字母和小写字母。
可以做密码强度的验证:
反向先行断言
反向先行断言就是保证右边不能出现某字符。(?!表达式)
完成。
比如取出喜欢两个字,要求喜欢后面不能出现你。
后行断言
先行断言是从左往右看,后行断言是从右往左看。
正向后行断言
(?<=表达式)
表示在某个位置向左看,该位置的左侧必须能匹配这个表达式。
比如要取出喜欢两个字,要求喜欢的前面有我,后面有你:
反向后行断言
(?<!表达式)
表示在某个位置向左看,所在位置左侧不能匹配表达式。
比如:取出喜欢两个字,要求喜欢前面没有我,后面没有你。
综合实践
1、提取生日日期
2、匹配所有小数