博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
正则表达式------捕获性分组,非捕获性分组,前瞻,后瞻
阅读量:5131 次
发布时间:2019-06-13

本文共 2687 字,大约阅读时间需要 8 分钟。

原来也接触一些正则表达式的编写,感觉一般的正则表达式应该都没有什么问题,但是同事最近问了系统登录密码验证的正则怎么写,需求:密码必须包含大写字母,小写字母和数字,想了一下想到了分组,想到如何无序验证,最后都失败了,看来还是太菜,平时写的一些正则表达式都是一些比较简单,什么惰性,分组等的。之后就在网站找了一下,看到下边一篇文章,看过之后恍然大悟,看来自己还是太菜根基不了啊。抄了一下文章内容,整理一下自己理解,做个笔记。

转载

捕获性分组

javascript中捕获性分组是以小括号()来实现,捕获性分组工作模式()会把每个分组里匹配的值保存起来。

比如利用捕获性分组把 hello world 互换成 world hello:

方法一:通过exec函数
var str = 'hello world';            //首先创建好字符串var pattern = /([a-z]+)\s([a-z]+)/; //先通过正则匹配这个字符串,用分组模式来获取这两个单词var arr = pattern.exec(str); // exec方法返回的是一个数组,包含匹配到的字符串以及分组(也称子串)里的值console.log(arr); //['hello world','hello','world']  console.log(arr[0]); //'hello world' 匹配到的字符串console.log(arr[1]); //'hello' 第一个分组([a-z]+)的值console.log(arr[2]); //'world' 第二个分组([a-z]+)的值//这时候两个分组的值都得到了,接下来用字符串拼接法实现互换var n_str = arr[2]+' '+arr[1];console.log(n_str) //world hello
方法二:通过属性$1-9
var str = 'hello world';            var pattern = /([a-z]+)\s([a-z]+)/; pattern.test(str); //这个地方必须运行正则匹配一次,方式不限,可以是test()、exec()、以及String的正则方式console.log(RegExp.$1) //'hello' 第一个分组([a-z]+)的值console.log(RegExp.$2) //'world' 第二个分组([a-z]+)的值var n_str = RegExp.$2+' '+RegExp.$1;console.log(n_str) //world hello
方法三:通过String的replace()
var str = 'hello world'; var pattern = /([a-z]+)\s([a-z]+)/; var n_str = str.replace(pattern,"$2 $1"); //这里的$1、$2与方法二里的RegExp.$1、RegExp.$2作用是相同的。console.log(n_str) //world hello

非捕获性分组:(?:)

非捕获性分组工作模式下分组(?:)会作为匹配校验,并出现在匹配结果字符里面,但不作为子匹配返回。

比如利用非捕获性分组获取字符串000aaa111,而且只返回一个值为aaa111的数组:

//先看用捕获性分组匹配会返回什么var str1 = '000aaa111';             var pattern = /([a-z]+)(\d+)/; //捕获性分组匹配var arr = pattern.exec(str1);  console.log(arr) //['aaa111','aaa','111']   结果子串也获取到了,这并不是我们想要的结果//非捕获性分组var str2 = '000aaa111';var pattern2 = /(?:[a-z]+)(?:\d+)/; //非捕获性分组匹配var arr2 = pattern.exec(str2);  console.log(arr2) //['aaa111']  结果正确

前瞻:(?=)和(?!)

前瞻分为正向前瞻和反(负)向前瞻,正向前瞻(?=表达式)表示后面要有什么,反向前瞻(?!表达式)表示后面不能有什么。

前瞻分组会作为匹配校验,但不出现在匹配结果字符里面,而且不作为子匹配返回。

正向前瞻匹配一批图片格式:

//正向前瞻,匹配.jpg后缀文件名var str = '123.jpg,456.gif,abc.jpg';var partern = /\w+(?=\.jpg)/g; //正向前瞻匹配console.log(str.match(partern)); //['123', 'abc']   返回结果正确,没有匹配456.gif

反向前瞻匹配一批字母加数字:

//反向前瞻,匹配3个及以上的a,而且后面不能有000的字符var str = 'aaa000 aaaa111 aaaaaaa222';var partern = /a{3,}(?!000)/g; //反向前瞻匹配console.log(str.match(partern)); //['aaaa', 'aaaaaaa']   返回结果正确,没有匹配aaa000

前瞻,可以放在位置不固定,可前匹配和后匹配,如:/(?=.jpg)\w+/g;

后顾:(?<=)和(?<!) —JavaScript不支持

后顾分为正向后顾和反(负)向后顾,正向后顾(?<=表达式)表示前面要有什么,反向后顾(?<!表达式)表示前面不能有什么。

/正向后顾(?<=abc) //前面需要有abc//反向后顾(?

名词解释:

前瞻 = 先行断言

(?=) 正向前瞻 = 正向零宽先行断言
(?!) 反向前瞻 = 负向前瞻 = 负向零宽先行断言

后顾 = 后发断言

(?<=) 正向后顾 = 正向零宽后发断言
(?<!) 反向后顾 = 负向后顾 = 负向零宽后发断言

备注,总结

可以通过多个前瞻组合一块控制,字符串里边必须包含指定字符。

示例:
(?=.[0-9].)(?=.[A-Z].)(?=.[a-z].).{6,20} 可以匹配包含大写字母,小写字母,数字

转载于:https://www.cnblogs.com/xiuluo--angel/p/7100312.html

你可能感兴趣的文章
poj 3750 小孩报数问题
查看>>
代码块。 单例
查看>>
HDU3591找零,背包
查看>>
摆脱jquery,用自己的JS库实现ajax功能
查看>>
win10 redis安装教程
查看>>
springboot整合curator实现分布式锁
查看>>
关于渐变属 gradient:
查看>>
android 入门-android Studio 配置
查看>>
字节流
查看>>
个人冲刺八
查看>>
Spring Security(09)——Filter
查看>>
oracle有关游标的知识
查看>>
深入解析C++ STL中的常用容器
查看>>
godoc
查看>>
日期操作类
查看>>
Java——表格
查看>>
驰骋工作流程引擎多人待办处理模式的升级
查看>>
使用JDK合成照片
查看>>
[总结] 继承
查看>>
读书笔记 计算机系统--系统架构与操作系统的高度集成 第一章概叙
查看>>