正则表达式学习笔记(一)

正则表达式的学习之路…

前言

在我的工作当中,正则表达式是使用非常频繁的,但是本人对于正则表达式的研究比较浅显,便只好把对正则的一些学习理解记录下来,方便以后翻阅。(感兴趣的朋友可自行搜索老姚的JavaScript正则表达式系列文章)

正文

正则表达式是匹配模式,要么匹配字符,要么匹配位置

两种模糊匹配

  1. 横向模糊匹配:可匹配的字符串长度是不固定的。实现方式是使用量词
    eg1:{m, n}表示连续出现最少m次,最多n次
    eg2:/ab{2,3}c/表示第一个字符是“a”,后面是2到5个”b”,最后是”c”

  2. 纵向模糊匹配:匹配的字符串具体到某一位时,可以不是某个确定的字符。实现方式是使用字符组
    eg1:[abc]表示匹配”a”、”b”、”c”中的任一字符
    eg2:/a[123]b/可以匹配三种字符:”a1b”、”a2b”、”a3b”

字符组

值得一提的是,虽然叫做字符组(字符类),但只是其中的一个字符。譬如[abc]匹配的是”a”、”b”、”c”其中之一

  1. 范围表示法
    如果一个字符组里面字符太多的话,可以用连字符“-”来省略和简写。
    譬如匹配字母,可以写为:[a-zA-Z]

    如果需要匹配的字符带有特殊字符,则应该放在开头、结尾或者转义,避免引擎认为是特殊用法

  2. 排除字符组(取反)
    [^abc]表示一个除”a”、”b”、”c”之外的任意字符。字符组第一位放^(脱字符)表示取反

  3. 常见简写形式

    字符组 具体含义
    d [0-9],表示一位数字
    D [^0-9],表示除数字外的任意字符
    w [0-9a-zA-Z_],表示数字、大小写字母、下划线
    W [^0-9a-zA-Z],表示非单词字符
    s [tnvrf],表示空白符,包括空格、水平垂直制表符、换行符、换页符、回车符
    S [^tnvrf],表示非空白符
    . 通配符,表示几乎任意字符

量词

  1. 简写形式

    量词 具体含义
    {m,} 表示至少出现m次
    {m} 表示出现m次
    ? 等价于{0,1},表示出现或者不出现
    + 等价于{1,},表示至少出现一次
    * 等价于{0,},表示有可能不出现,或出现任意次
  2. 贪婪匹配与惰性匹配
    贪婪匹配:在满足条件的情况下,尽可能多的匹配
    惰性匹配:在满足条件的情况下,尽可能少的匹配

1
2
3
4
5
var reg1 = /d{2,5}/g;
var reg2 = /d{2,5}?/g;
var str = "123 1234 12345 123456";
console.log(str.match(reg1)); //["123", "1234", "12345", "12345"]
console.log(str.match(reg2)); //["12", "12", "34" "12", "34", "12", "34", "56"]

上面代码单独运算时,呈现出了两种不同的结果;其中reg1运算是贪婪匹配,reg2是惰性匹配(通过在量词后面加”?“就能实现)

  1. 多选分支
    多选分支可以支持多个子模式任选其一。譬如(p1|p2|p3),其中p1,p2,p3是子模式,用管道符(|)分隔表示其中任何之一。
1
2
3
var reg = /good|nice/g;
var str = "good idea, nice boy.";
console.log(str.match(reg)); //["good","nice"]

值得注意的是,分支结构属于惰性匹配,就是当前面的匹配上了,后面的就不在尝试了

1
2
3
var reg = /good|goodbye/g;
var str = "goodbye";
console.log(str.match(reg)); //["good"]

经典案例分析

匹配字符,其实就是字符串、量词、分支结构的组合使用(注意:案例代码使用了全局匹配g,需要单独验证,否则会出错)

  1. 匹配16进制颜色

    分析:
    表示一个16进制字符,可以用字符组[0-9a-fA-F]
    其中字符可以出现3次或者6次,需要用量词和分支结构,使用分支结构时需要注意顺序

1
2
3
var reg = /#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})/g;
var str = "#FF6600 #fff #CCc";
console.log(str.match(reg)); //["#FF6600","#fff","#CCc"]
  1. 匹配24小时制时间

    分析:
    24小时制时间展示主要如:23:59、02:01
    共有4个数字,第一位数字可以是[0-2]
    当第一位数字是”2”时,第二位可以是[0-3],否则第二位是[0-9]
    第三位可以是[0-5],第四位可是是[0-9]
    如果要求匹配”2:2”这种时间格式,则前面的0是可以省略的

1
2
3
4
var reg = /^(0?[0-9]|1[0-9]|[2][0-3]):(0?[0-9]|[1-5][0-9])$/g;
console.log(reg.test("23:59")); //true
console.log(reg.test("02:03")); //true
console.log(reg.test("2:2")); //true
  1. 匹配日期(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
2
var reg = /^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/g;
console.log(reg.test("2017-02-05")); //true

结束语

掌握字符组和量词的大致知识,基本上就算是正则入门了…后续再学习有关于正则表达式的位置匹配~