
正则表达式的学习之路…
前言
在我的工作当中,正则表达式是使用非常频繁的,但是本人对于正则表达式的研究比较浅显,便只好把对正则的一些学习理解记录下来,方便以后翻阅。(感兴趣的朋友可自行搜索老姚的JavaScript正则表达式系列文章)
正文
正则表达式是匹配模式,要么匹配字符,要么匹配位置
两种模糊匹配
-
横向模糊匹配:可匹配的字符串长度是不固定的。实现方式是使用
量词
eg1:{m, n}表示连续出现最少m次,最多n次
eg2:/ab{2,3}c/表示第一个字符是“a”,后面是2到5个”b”,最后是”c” -
纵向模糊匹配:匹配的字符串具体到某一位时,可以不是某个确定的字符。实现方式是使用
字符组
eg1:[abc]表示匹配”a”、”b”、”c”中的任一字符
eg2:/a[123]b/可以匹配三种字符:”a1b”、”a2b”、”a3b”
字符组
值得一提的是,虽然叫做字符组(字符类),但只是其中的一个字符。譬如[abc]匹配的是”a”、”b”、”c”其中之一
-
范围表示法
如果一个字符组里面字符太多的话,可以用连字符“-”来省略和简写。
譬如匹配字母,可以写为:[a-zA-Z]如果需要匹配的字符带有特殊字符,则应该放在开头、结尾或者转义,避免引擎认为是特殊用法
-
排除字符组(取反)
[^abc]表示一个除”a”、”b”、”c”之外的任意字符。字符组第一位放^(脱字符)表示取反 -
常见简写形式
字符组 具体含义 d [0-9],表示一位数字 D [^0-9],表示除数字外的任意字符 w [0-9a-zA-Z_],表示数字、大小写字母、下划线 W [^0-9a-zA-Z],表示非单词字符 s [tnvrf],表示空白符,包括空格、水平垂直制表符、换行符、换页符、回车符 S [^tnvrf],表示非空白符 . 通配符,表示几乎任意字符
量词
-
简写形式
量词 具体含义 {m,} 表示至少出现m次 {m} 表示出现m次 ? 等价于{0,1},表示出现或者不出现 + 等价于{1,},表示至少出现一次 * 等价于{0,},表示有可能不出现,或出现任意次 -
贪婪匹配与惰性匹配
贪婪匹配:在满足条件的情况下,尽可能多的匹配
惰性匹配:在满足条件的情况下,尽可能少的匹配
1 |
var reg1 = /d{2,5}/g; |
上面代码单独运算时,呈现出了两种不同的结果;其中reg1运算是贪婪匹配,reg2是惰性匹配(通过在量词后面加”?“就能实现)
- 多选分支
多选分支可以支持多个子模式任选其一。譬如(p1|p2|p3),其中p1,p2,p3是子模式,用管道符(|)分隔表示其中任何之一。
1 |
var reg = /good|nice/g; |
值得注意的是,分支结构属于惰性匹配,就是当前面的匹配上了,后面的就不在尝试了
1 |
var reg = /good|goodbye/g; |
经典案例分析
匹配字符,其实就是字符串、量词、分支结构的组合使用(注意:案例代码使用了全局匹配g,需要单独验证,否则会出错)
- 匹配16进制颜色
分析:
表示一个16进制字符,可以用字符组[0-9a-fA-F]
其中字符可以出现3次或者6次,需要用量词和分支结构,使用分支结构时需要注意顺序
1 |
var reg = /#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})/g; |
- 匹配24小时制时间
分析:
24小时制时间展示主要如:23:59、02:01
共有4个数字,第一位数字可以是[0-2]
当第一位数字是”2”时,第二位可以是[0-3],否则第二位是[0-9]
第三位可以是[0-5],第四位可是是[0-9]
如果要求匹配”2:2”这种时间格式,则前面的0是可以省略的
1 |
var reg = /^(0?[0-9]|1[0-9]|[2][0-3]):(0?[0-9]|[1-5][0-9])$/g; |
- 匹配日期(yyyy-mm-dd格式)
分析:
年:四位数即可,可以表示为[0-9]{4}
月:分为两种情况:”01”、”02”、…、”09”和”10”、”11”、”12”,可以表示为(0[1-9]|1[0-2])
日:最大为31日,可以表示为(0[1-9]|[12][0-9]|3[01])
1 |
var reg = /^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/g; |
结束语
掌握字符组和量词的大致知识,基本上就算是正则入门了…后续再学习有关于正则表达式的位置匹配~




近期评论