以下是自己学习正则的一些心得,有不正之处请评论区提出
1.1 正则模糊匹配
1.横向模糊匹配 {}
```
横向匹配指的是匹配的长度不固定,{m,n}指的是前面字符出现最少m次,最多n次,如果n不写表示,可以出现无数次
例如:
/ab{2,5}c/ 这个正则表示在a于c之间,可以出现2-5次的b,才能满足条件,比如abbc abbbc ;abc这个就不满足,因为b出现的次数只有1次
```
2.纵向模糊匹配 []
```
纵向模糊匹配指的是,具体到匹配某一个字符时候,他可以是不确定的字符
例如:
/a[bcd]e/ 这个正则表示在a e之间,可以是b c d中的任意一个 abe ace ade
```
1.2 字符组
1.2.1 范围表示法 -
字符中,如果字符特别多,采用- 字符来表示连续的字符,比如说匹配 abcdefghijklmn,这一串字符中的任意一个字符,就可以简写 a-n;123456 简写 1-6
1.2.2 排除字符(反义)^
前面说的都是匹配某个字符,但是如果想不匹配某个字符,就需要用到取反字符^例如:
不想匹配a b c字符, [^abc] 表示不匹配a b c
1.2.3 常见的简写形式 \d \w \s .
\d 表示[0-9] \D 表示取反 [^0-9]
\w 表示[0-9a-zA-Z_] 数字、大小写字母 _下划线 \W 表示 [^0-9a-zA-Z_]
\s 表示[\t\v\n\r\f] 一些制表符号换行啦回车啦,空白符 \S 表示取反[^\t\v\n\r\f]非空白符
. [^\n\r\u2028\u2029]通配符,可以理解为任意的字符,换行符、回车符、行分隔符和段分隔符除外。
1.3 量词 也称重复
1.3.1 简写 {m,} {m} ? + *
{m,} 至少出现 m 次
{m} 出现 m 次
? {0,1}表示出现或者不出现,可以理解为问号,有吗?
+ {1,}表示至少出现 1 次
* {0,} 表示 0 次或者任意次数
举例:/a{1,2}b{3,}c{4}d?e+f*/
解析:a出现1-2次 b出现最少3次 c出现4次 d可出现可不出现(出现最多1次) e最少出现1次 f可出现可不出现(出现次数不做限制)
1.3.2 贪婪匹配与惰性匹配
var regex = /\d{2,5}/g;
var string = "123 1234 12345 123456";
console.log( string.match(regex) );
// => ["123", "1234", "12345", "12345"]
解析:\d 表示数字 {2,5}表示最少2次数字,最多5次数字
贪婪:虽然数字连续出现2-5次,那我会匹配2次,3次,4次,5次的连续数字,也就是长度符合2-5之间的位数,我都会匹配,你给我6个,我就要5个,给3个,要3个
惰性匹配:只要在量词后面加个?,即可实现惰性匹配{m,n}? {m,}? ?? +? *?
var regex = /\d{2,5}?/g;
var string = "123 1234 12345 123456";
console.log( string.match(regex) );
// => ["12", "12", "34", "12", "34", "12", "34", "56"]
解析:这个正则相比上面的多了个?,表示虽然 2 到 5 次都行,当 2 个就够的时候,就不再往下尝试了。
案例:/a{1,2}?b{3,}?c{4}?d??e+?f\*?/ str='aaabbbccccef' str.match(reg) => aaabbbccccef
a 最多 2 个;b 最少 3 个;c 最少 4 个 d 可要可不要(那我惰性模式,直接选择不要);e 一个或多个(惰性选择 1 个);f0 个或者无数个(惰性模式直接选择 0 个)
1.4 多选分支(惰性) |
|可以理解为‘或’ ;多选分支可以支持多个子模式,比如(a|b|c) a b c 就是子模式多选分支是惰性的,匹配到其中一个,就会暂停,例如
str = 'goodbye'
reg=/good|goodby/g
匹配结果是good
如果reg=/goodby|good/g,你会看到结果是goodby
1.5 以上内容案例分析
匹配字符,就是字符组,量词、分支结构的组合使用
1.5.1 16 进制颜色
#ffffff #Fc01DF #fff 可以看出#后面 3 位或者 6 位
/#([a-zA-Z0-9]{6}|[A-Za-z0-9]{3})/g
1.5.2 匹配时间 23:59 02:07
从上面时间看出第一位 max2 min0;第二位,如果第一位是 2 的话 max3 min0;如果是 1 的话,max9,min0
后面两位:第一位 max5 min0;最后一位 min0 max9
/^([01][0-9]|[2][0-3]):[0-5][0-9]$/g
时间一般都是23:09 09:07这种双数,但是如果要求可以是9:7 23:9 可以使用惰性匹配,一下两种都可以
var regex = /^(0?[0-9]|1[0-9]|[2][0-3]):(0?[0-9]|[1-5][0-9])$/;
var regex = /^(0?[1][0-9]|[2][0-3]):[0-5][0-9]$/g;
1.5.3 匹配日期 yyyy-mm-dd 格式
要求匹配 2017-06-10
分析:前面是四个数字[0-9]{4} ;后面是日期0-12 最后面是天数0-31
regx=/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/
1.5.3 匹配磁盘路径 盘符:\文件夹\文件夹\文件夹\
1.匹配前面的盘符是字母,不区分大小写[a-zA-Z]:\\
2.后面文件夹,文件夹不能有特殊字符[^\\:*<>|"?\r\n];并且他们的文件夹名字不能为空,也就是至少有1个字符+ [^\\:*<>|"?\r\n]+\\;
3.文件夹\ 后面可以出现0次或者多次,采用* /[a-zA-Z]:\\([^\\:*<>|"?\r\n]+\\)*/
4.路径的最后文件是没有\的,所以 d:\(多个文件夹\)(文件夹);复盘开头,文件夹结尾
/^[a-zA-Z]:\\([^\\:*<>|"?\r\n]+\\)*([^\\:*<>|"?\r\n])$/
1.5.4 匹配 id
<div id="container" class="main"></div> 中匹配出id="container"
/id=".*?"/ 加上?采用惰性模式,不然他会匹配到最后一个main
1.6 正则表达式位置匹配
1.6.1 什么是位置
可以把位置理解为空字符就是相邻字符之间的位置 abcd 这四个字母中,a 前方的 b 前方的 c 前方的 d 前方的以及后方的,都是位置
1.6.2 如何匹配位置 $ \b \B (?=p) (?!p)这几种都是匹配位置的字符
1.6.3 ^和$
^ 匹配开头$ 匹配结尾
var result = "hello".replace(/^|$/g, '#');
=> #hello#
解析: |为多选分支,表示或;^|$ 表示开头或结尾,顾在hello的开头和结尾都加入字符#
1.6.4 \b \B
\b 是单词边界,也就是\w 与\W 之间的位置,也包括 \w 与 ^ 之间的位置,和 \w 与 $ 之间的位置字符组:\w 表示[0-9a-zA-Z_] \W 就是取反的意思\b 表示文字的边界,即匹配数字、字母、下划线,简而言之,如果两个相邻的字符之间不是数字、字母、下划线中的其中 2 种,位置就会被匹配到
var result = "[JS] Lesson_01.mp4".replace(/\b/g, '#');
console.log(result);
// => "[#JS#] #Lesson_01#.#mp4#
var result = "[JS] Lesson_01.mp4".replace(/\B/g, '#');
console.log(result);
// => "#[J#S]# L#e#s#s#o#n#_#0#1.m#p#4"
1.6.5 (?=p) (?!p) 匹配的是位置
p 是子模式,即 p 前面位置;而在本人看来,(?=p) 就与 ^ 一样好理解,就是 p 前面的那个位置。
var result = "hello".replace(/(?=l)/g, '#');
// => "he#l#lo"
就是在l的前面位置替换为#
var result = "hello".replace(/(?!l)/g, '#');
// => "#h#ell#o#"
就是在l的前面位置不替换#,也就是别的地方要替换成#
1.6.6 数字的千位分隔符表示
a='123345678'
a.replace(/(?!^)(?=\d{3}+$)/g,',')
1.6.7 验证密码问题
密码长度 6-12 位,有数字、大小写字母组成,单必须最少包含 2 种字符
var regex = /((?=.*[0-9])(?=.*[a-z])|(?=.*[0-9])(?=.*[A-Z])|(?=.*[a-z])(?=.*[A-Z]))^[0-9A-Za-z]{6,12}$/;
var regex = /(?!^[0-9]{6,12}$)(?!^[a-z]{6,12}$)(?!^[A-Z]{6,12}$)^[0-9A-Za-z]{6,12}$/;
1.7 ()括号作用
1.7.1 分组
可以用于数据提取、替换。在匹配过程中,给每个分组都开辟空间,用来存储匹配到的数据
未完待续....