前言
虽然工作四五年了,都没怎么使用过正则,但是它一直都是我心中的一个痛,尤其是我月初手写webpack-loader完成项目需求时,使用了大量的字符串的find、replace等操作,这让我再一次存在这样的疑问:如果是正则,会不会更好?
元字符
^、$、.、*、+、?、|、\、/、(、)、[、]、{、}、=、!、:、-
横向匹配与纵向匹配
横向匹配
一般字符值是确定的,但是该字符出现的个数不确定,比如ab、abb、abbb、abbb...b中,b出现的次数不确定
代表字符:
{}:具体指定出现次数
?:0|1次
+:>=1次
*:>=0次
纵向匹配
一般针对某一个字符做限定,如ab、ac、ad、af中,b的值不确定
代表字符:
.:通配符,表任意字符
-:范围
[]:具体指定可选值
^:排除(仅用在[]时)
\d:数字
\w:数字|字母|下划线
\s:空白符,如空格、水平制表符、垂直制表符、换行符、回车符、换页符等
\D|\W|\S:上述小写取反
贪婪与惰性
贪婪
按最大范围匹配
惰性
按最小范围匹配,使用?标识
分支
标识符
|
一般与()搭配使用
修饰符
g:后一次匹配从上一次匹配成功的下一个位置开始
m:多行匹配
i:忽略大小写
优先级
\ ()或[] {}或*或?或+ ^或$或字符字面量 |
示例
取任意字符
[^]
取除了abc外的
[-ac]
匹配十六进制颜色值
分析:
十六进制以“#”开头,但是并不能使用^,因为这代表整个字符的开头
除了#外,其余字符为数字和字母,但是下划线不行,故为[\da-fA-F],且需要使用()与#隔开
颜色值可以是3位也可以是6位,故需要使用分支:|
结果:
配送时间--24小时制
分析:
若时的十位为2时,时的个位只能为0、1、2、3
分的十位最高取到6
涉及两种情况,需要使用|+()
结果:
匹配日期
分析:
和时间一样,主要分析出分支
[0-38]代表的是0、1、2、3和8,而不是0到38
结果:
匹配文件路径
分析:
盘符可以是任意的大小写字母,对于冒号而言,我不确定需不需要转译,那就转译准没错
剩下的文件夹,分两种情况:
如果是最后一个,则没有\,且要么有要么没有
如果不是最后一个,则一定有\,且为0或多个
虽说是两种情况,但这里并不是分支的概念
结果:
匹配id
分析:
使用.可以匹配任意字符,为空的不要,故为.+
但是.也会匹配引号,故想要进行贪婪,匹配到右引号即停止
?是对匹配结果进行贪婪,而非前一个,如.+?“标识对任意字符匹配到问号为止,而不是对+
结果: