轻松学习正则表达式
正则表达式快速学习
用法
1.pattern.test(str)来检测是否符合规则;
2.str.match(pattern)获取符合条件的数组
1.主要元字符
^ 匹配字符串的开始;
$ 匹配字符串的结束;
\b 匹配字符串的开始或结束; \B 非边界
\d 匹配数字; \D 非数字
\s 匹配空白符; \S 非空白符
\w 匹配数字字母汉字下划线;
. 匹配换行符以外的任意字符;
特别说明[^],此时^是非的含义
辅助记忆:
b-boundary边界;d-digit从0到9的任意数字;s-space空格;w-word单词、字
/^\s*|\s*$/ //开头或者结尾出现空格
/\bCha/ //匹配开头三个字母Cha
/ter\b/ //匹配结尾三个字母ter
/\Bapt/ //匹配非开头和结尾三个字母apt
2.重复限定符
* //重复0或者多次(>=0){0,}
+ //重复1或者多次( >=1){1,}
?//重复0或者1次 ( 0、1){0,1}
{n} //重复n次
{n,} //重复n或者n多次
{n,m} //重复n-m次
辅助记忆:
* 在css和很多地方都代表全局,所以范围最广
?最弱,0或者1次
+可以记忆为不为空,所以至少1次
/^\d{8}$/ //8位的QQ号
/^\d{n,}$/ //至少n位的数字
/^\d{14,18}$/ //14-18位银行卡号
/^1\d{10}$/ //以1开头的手机号码
/^ab*$/ //以a开头的,0个或多个b结尾的字符串
/^(-)?\d+(.\d{1,2})?$/ //带1-2位小数的正数或负数,划分(-)?、\d+、(.\d{1,2})?
var str='<h1>hello word!</h1>';
/<.*>/ //匹配所有内容
/<.*?>/ //匹配第一对<>中的h1,?限制了最多一次
/<\w+?>/ //匹配第一对<>中的h1
3.分组()
括号中的内容作为一个整体,用来划分表达式。
/^(ab)*/ //匹配字符串中包含0到多个ab开头
/^\d+(\.\d+)?$/ //非负浮点数
4.区间[]
[0-9]限定0-9的数字
[A-Za-z]限定英文
[A-Za-z0-9]限定英文和数字
[165]限定某些数字
/^[\u4e00-\u9fa5]{0,}$/ //汉字
/^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$/ //手机号码
/^(13[0-9]|14[5|7]|1[5|8][^4])\d{8}$/ //手机号码精简
5.其他
条件:|或
转义:判断如$+等等的元字符、限定符或者关键字,要在转义的字符前面加个反转义符号\。如\$、\+。
进阶--零宽断言
圆括号会有一个副作用,相关的匹配会被缓存,而零宽指的是它匹配到的内容不会保存到匹配结果中去。
作用是给指定位置添加一个限定条件,用来规定此位置之前或者之后的字符必须满足限定条件才能使正则中的字表达式匹配成功。
javascript只支持零宽先行断言,而零宽先行断言又可以分为正向零宽先行断言,和负向零宽先行断言。
?=、?<=、?!、?<!=
exp1(?=exp2) //查找 exp2 前面的 exp1
(?<=exp2)exp1 //查找 exp2 后面的 exp1
exp1(?!exp2) //查找后面不是 exp2 的 exp1
(?<!=exp2)exp1 //查找前面不是 exp2 的 exp1
?=、?!都是判断表达式前面(先行),?<=、?<!=都是判断表达式后面(后行)。
进阶--捕获和非捕获
() 表示捕获分组,它 把每个分组里匹配的结果保存,分配序号(0是整个匹配结果,从1开始递增对应从左到右的括号,先外后内)。
str=234567
/(2(3)4)(5(6)7)/
匹配分组
匹配分组
- 0---- '234567'
- 1---- '234'
- 2---- '3'
- 3---- '567'
- 4---- '6'
1.数字编号捕获组(exp)
我们常用的就是数字编号捕获组。
- 命名编号捕获组(?<name>exp)
str='020-8886666'
(?<name1>0\d{2})-(?<name2>\d{7})
匹配分组
- 0----020-8886666
- 1----组名name1----020
- 2----组名name2----888666
非捕获组只匹配结果,但不捕获结果,也不会分配组号,也不能在表达式和程序中做进一步处理。
匹配分组
- 0---- '234567'
- 1---- '234567'
进阶--反向引用
1.数字编号组反向引用:\num
str='abcd'
(\w)(\w)\2\1 // 匹配到abba
2.命名编号组反向引用:\k<name>
(?<a>\w)(?<b>\w)\k<a>\k<b> // 匹配到abba
进阶--贪婪和非贪婪
贪婪:匹配尽可能多的字符,重复限定词是贪婪量词。
1 文本:61762828 176 2991 44 871
2 贪婪模式:\d{3,6}
3 匹配结果:617628
4 匹配结果:176
5 匹配结果:2991
6 匹配结果:871
深度优先原则,也就是从左到右的每一个贪婪量词,优先最大数量的满足,剩余再分配下一个量词匹配
1 文本:61762828 176 2991 87321
2 贪婪模式:(\d{1,2})(\d{3,4})
3 匹配结果:617628 ------(61 7628)
4 匹配结果:2991 ------(29 91)
5 匹配结果:87321 ------(87 321)
非贪婪:懒惰,在贪婪量词后加?
1 文本:61762828 176 2991 87321
2 贪婪模式:(\d{1,2}?)(\d{3,4})
3 匹配结果:61762 ------(6 1762)
4 匹配结果:2991 ------(2 991)
5 匹配结果:87321 ------(8 7321)