五、正则表达式的拆分

拆分正则代码块,是理解正则的关键。

在 JavaScrip 正则表达式有以下结构:

  • 字面量: 匹配一个具体字符,如 a 匹配字符 a
  • 字符组: 匹配一个有多种可能性的字符,如 [0-9] 匹配任意一个数字。
  • 量词: 匹配一个连续出现的字符,如 a{1,3} 匹配连续最多出现 3 次的a字符。
  • 锚: 匹配一个位置,如 ^ 匹配字符串的开头。
  • 分组: 匹配一个整体,如 (ab) 匹配 ab 两个字符连续出现。
  • 分支: 匹配一个或多个表达式,如 ab|bc 匹配 abbc 字符。

另外还有以下操作符:

优先级 操作符描述 操作符
1 转义符 \
2 括号和方括号 (...)/(?:...)/(?=...)/(?!...)/[...]
3 量词限定符 {m}/{m,n}/{m,}/?/*/+
4 位置和序列 ^/$/\元字符/一般字符
5 管道符 ` `

Tips:优先级从上到下,由高到低。

1. 注意要点

  • 匹配字符串整体

不能写成 /^abc|bcd$/ ,而是要写成 /^(abc|bcd)$/

  • 量词连缀问题

需要匹配:每个字符是 a/b/c 中其中一个,并且字符串长度是 3 的倍数:

不能写成 /^[abc]{3}+$/ ,而是要写成 /([abc]{3})+/

  • 元字符转义问题

元字符就是正则中的特殊字符,当匹配元字符就需要转义,如:

^$.*+?|\/()[]{}=!:-

  1. // "[abc]" => /\[abc\]/ 或者 /\[abc]/
  2. // "{1,3}" => /\{1\}/ 或者 /\{1}/ 因为不构成字符组

2. 案例分析

  • 身份证号码
  1. /^(\d{15}|\d{17})[\dxX]$/.test("390999199999999999");// true
  • IPV4地址

需要好好分析:

  1. let r = /^((0{0,2}\d|0?\d{2}|1\d{2}|2[0-4]\d|25[0-5])\.){3}(0{0,2}\d|0?\d{2}|1\d{2}|2[0-4]\d|25[0-5])$/