原来也接触一些正则表达式的编写,感受通常的正则表达式应该都没有什么问题,可是同事最近问了系统登陆密码验证的正则怎么写,需求:密码必须包含大写字母,小写字母和数字,想了一下想到了分组,想到如何无序验证,最后都失败了,看来仍是太菜,平时写的一些正则表达式都是一些比较简单,什么惰性,分组等的。以后就在网站找了一下,看到下边一篇文章,看过以后恍然大悟,看来本身仍是太菜根基不了啊。抄了一下文章内容,整理一下本身理解,作个笔记。javascript
javascript中捕获性分组是以小括号()来实现,捕获性分组工做模式()会把每一个分组里匹配的值保存起来。java
好比利用捕获性分组把 hello world 互换成 world hello:正则表达式
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
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
var str = 'hello world'; var pattern = /([a-z]+)\s([a-z]+)/; var n_str = str.replace(pattern,"$2 $1"); //这里的$一、$2与方法二里的RegExp.$一、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'] 结果正确
前瞻分为正向前瞻和反(负)向前瞻,正向前瞻(?=表达式)表示后面要有什么,反向前瞻(?!表达式)表示后面不能有什么。网站
前瞻分组会做为匹配校验,但不出如今匹配结果字符里面,并且不做为子匹配返回。.net
正向前瞻匹配一批图片格式:code
//正向前瞻,匹配.jpg后缀文件名 var str = '123.jpg,456.gif,abc.jpg'; var partern = /\w+(?=\.jpg)/g; //正向前瞻匹配 console.log(str.match(partern)); //['123', 'abc'] 返回结果正确,没有匹配456.gif
反向前瞻匹配一批字母加数字:blog
//反向前瞻,匹配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;图片
后顾分为正向后顾和反(负)向后顾,正向后顾(?<=表达式)表示前面要有什么,反向后顾(?<!表达式)表示前面不能有什么。
/正向后顾 (?<=abc) //前面须要有abc //反向后顾 (?<!abc) //前面不能有abc
名词解释:
前瞻 = 先行断言
(?=) 正向前瞻 = 正向零宽先行断言
(?!) 反向前瞻 = 负向前瞻 = 负向零宽先行断言
后顾 = 后发断言
(?<=) 正向后顾 = 正向零宽后发断言
(?<!) 反向后顾 = 负向后顾 = 负向零宽后发断言
能够经过多个前瞻组合一块控制,字符串里边必须包含指定字符。
示例:
(?=.[0-9].)(?=.[A-Z].)(?=.[a-z].).{6,20} 能够匹配包含大写字母,小写字母,数字