正则表达式

关注公众号 jb51net

关闭
首页 > 网络编程 > 正则表达式 > 正则表达式?=、?!、?<=、?<!、?:

正则表达式中?=、?!、?<=、?<!、?:的理解与应用举例

作者:千叶KE

正则表达式就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个规则字符串,这个规则字符串表达对字符串的一种过滤逻辑,这篇文章主要给大家介绍了关于正则表达式中?=、?!、?<=、?<!、?:的理解与应用举例的相关资料,需要的朋友可以参考下

一、?=、?!、?<=、?<!、?:的解释

1. 先看一下比较官方的解释

2. 再看一下比较通俗易懂的解释:

是不是有点明白了,其实?=、?!、?<=、?<!的意思可以理解为 if 判断,即只有先通过它们(RegExp2)的判断之后,才可以获取到正则(RegExp1)的匹配结果。

3. 零宽度断言

?=、?!、?<=、?<!其实就是正则表达式中的零宽度断言,以上面的举例来解释↓

 RegExp2匹配到的内容是不会返回的,也不会消耗匹配到的字符,只会返回RegExp1的匹配结果,这就是零宽度断言,零宽度断言在正则表达式中非常有用,因为它们可以在不改变匹配结果的情况下,对匹配位置前后的内容进行限制或判断。

4. ?: 的解释

(?:) 并不是零宽度断言,而是非捕获组,它跟普通的括号 () 的区别在于,它不会保存匹配到的内容,但是它仍然会消耗字符并返回匹配内容,只是不会保存匹配结果。

二、举例

?=

'我喜欢苹果'.replace(/我喜欢(?=苹果)/,'我讨厌') // 匹配 我喜欢苹果 中的 我喜欢 并替换为 我讨厌,因为是零宽度断言所以不包含苹果,故结果为 我讨厌苹果
'我喜欢橘子'.replace(/我喜欢(?=苹果)/,'我讨厌') // 我喜欢后面不是苹果,所以这里正则未通过,匹配不到任何内容,故结果仍为 我喜欢橘子

?!

'我喜欢苹果'.replace(/我喜欢(?!苹果)/,'我讨厌') // 匹配后面不是苹果的我喜欢,正则未通过,故结果仍为 我喜欢苹果
'我喜欢橘子'.replace(/我喜欢(?!苹果)/,'我讨厌') // 正则通过,匹配到 我喜欢 进行替换,因为是零宽度断言所以橘子不在匹配结果中,故结果为 我讨厌橘子

?<=

'我喜欢苹果'.replace(/(?<=我喜欢)苹果/,'西红柿') // 匹配到 苹果 ,故结果为 我喜欢西红柿
'我喜欢橘子'.replace(/(?<=我喜欢)苹果/,'西红柿') // 匹配不通过,故结果仍为 我喜欢橘子

?<

'我讨厌苹果'.replace(/(?<!我喜欢)苹果/,'西红柿') // 匹配到 苹果 ,故结果为 我讨厌西红柿
'我喜欢苹果'.replace(/(?<!我喜欢)苹果/,'西红柿') // 匹配不通过,故结果仍为 我喜欢苹果

?:

'hello world'.replace(/(?:hello) (world)/,'$1') // 匹配内容为hello world,但是hello并没有被保存,因此$1取的是world,故结果为world

三、特殊情况

正则平时我们很少会自己写,一般都是复制别人的~~~(别人的才是最好的)。然后就经常看到一种写法,比如:

/(?=.*[A-Z])[A-Za-z]{5,10}/

这时候可能有些人就想,咦,(?=)不都是符合条件后匹配它前面的内容吗?这里为什么能放在开头 呢,他前面没内容啊?其实大家可以这么理解,当(?=)前面没有内容,或者说(?=)被放在正则开头使用时,(?=)的作用就相当于检索全部内容是否符合它的要求,如果不符合也就没必要继续向后匹配了,这就很像if判断,只有当条件为true时,才能执行后面的内容。

所以这里的正则意为:先检查内容中是否至少包含一个大写字母,如果有,则继续检查并匹配5~10个大小写字母,将这5~10个大小写字母作为结果返回。

四、实例应用

姓名脱敏(添加*号)

'李小龙'.replace(/(?<=[\u4e00-\u9fa5])[\u4e00-\u9fa5]/g, '*') // 李**

手机号/银行账号脱敏

'13912345678'.replace(/(?<=\d{3})\d(?=\d{3})/g, '*') // 139*****678

强密码规则校验

// 密码不能为空,8-30位,至少包含一个大写字母、小写字母、数字、特殊字符
/^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[\W_])(?!.*[\u4e00-\u9fa5])(?!\s)[a-zA-Z0-9\W_]{8,30}$/

“?”的几种用法

总结 

到此这篇关于正则表达式中?=、?!、?<=、?<!、?:的理解与应用举例的文章就介绍到这了,更多相关正则表达式?=、?!、?<=、?<!、?:内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文