初入正则表达式

以下是自己学习正则的一些心得,有不正之处请评论区提出

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 分组


可以用于数据提取、替换。在匹配过程中,给每个分组都开辟空间,用来存储匹配到的数据

未完待续....

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值