正则表达式学习(1)
oliver34 Engineer

Some people, when confronted with a problem, think “I know, I’ll use regular expressions.” Now they have two problems.(如果你有一个问题,你想到可以用正则来解决,那么你有两个问题了)

正则表达式的功能

  1. 校验数据的有效性(比如手机号,邮箱的格式);
  2. 查找符合要求的文本;
  3. 对文本进行切割,替换等操作(比如用连续的空白符切割)

元字符

即在正则表达式中具有特殊意义的专用字符

  • 特殊单字符
    • .任意字符
    • \d 任意数字 \D 任意非数字
    • \w 任意字母数字下划线 \W 任意非字母数字下划线
    • \s 任意空白符 \S 任意非空白符
  • 空白符
    • \r 回车符
    • \n 换页符
    • \t 制表符
    • \v 垂直制表符
    • \s 任意空白符
  • 量词
    • * 0到多次
    • + 1到多次
    • ? 0到1次
    • {m} 出现m次
    • {m,} 出现至少m次
    • {m,n} m到n次
  • 范围
    • | 或,如ab|bc表示ab或者bc
    • […] 多选1,括号中任意单个元素
    • [a-z] 匹配a到z之间任意单个元素(包含a,z)
    • [^…] 取反,不能是括号中的任意单个元素

贪婪、非贪婪与独占模式

  • 贪婪匹配
    尽可能进行最长的匹配(默认是贪婪的)
  • 非贪婪匹配
    • 尽可能进行最短匹配
    • 在量词后面加?就可以把贪婪模式变成非贪婪模式
  • 独占模式
    • 贪婪模式和非贪婪模式都要进行回溯
    • 独占模式也会尽可能进行多的匹配,但是匹配失败就结束,不会回溯
    • 在量词后面加+就可以吧贪婪模式变成独占模式
    • 独占模式因为不进行回溯,所以性能更好

分组与引用

  • 分组于编号

    • ()在正则中表示分组
    • 第几个括号就是第几个分组
      \d{11}(\d{3})?
    • 在括号里面使用 ?: 表示不保存子组(可以提高性能)
      \d{11}(?:\d{3})?
  • 分组引用在查找中使用
    /(\w+)/\1 找连续重复出现的单词 ((\w+)代表分组,此时只有一个分组,\1代表第一个分组的内容.于是,该正则意思是:某单词+空格+某单词,这样就实现了连续重复单词的匹配)

匹配模式

  • 不区分大小写模式(Case-Insensitive)
    (?i) 例:/(?i)cat/
    • js写法 /regx/i
  • 点号通配模式
    .匹配包括换行符号的任意字符,使用(?s)
    • js 不支持
  • 多行模式
    使^$能匹配上每行的开头或结尾,使用(?m)
  • 注释模式
    正则表达式的注释,使用(?#)