五、正则表达式的拆分
拆分正则代码块,是理解正则的关键。
在 JavaScrip 正则表达式有以下结构:
- 字面量: 匹配一个具体字符,如
a
匹配字符a
。 - 字符组: 匹配一个有多种可能性的字符,如
[0-9]
匹配任意一个数字。 - 量词: 匹配一个连续出现的字符,如
a{1,3}
匹配连续最多出现 3 次的a
字符。 - 锚: 匹配一个位置,如
^
匹配字符串的开头。 - 分组: 匹配一个整体,如
(ab)
匹配ab
两个字符连续出现。 - 分支: 匹配一个或多个表达式,如
ab|bc
匹配ab
或bc
字符。
另外还有以下操作符:
优先级 | 操作符描述 | 操作符 | |
---|---|---|---|
1 | 转义符 | \ |
|
2 | 括号和方括号 | (...) /(?:...) /(?=...) /(?!...) /[...] |
|
3 | 量词限定符 | {m} /{m,n} /{m,} /? /* /+ |
|
4 | 位置和序列 | ^ /$ /\元字符 /一般字符 |
|
5 | 管道符 | ` | ` |
Tips:优先级从上到下,由高到低。
1. 注意要点
- 匹配字符串整体
不能写成 /^abc|bcd$/
,而是要写成 /^(abc|bcd)$/
。
- 量词连缀问题
需要匹配:每个字符是 a
/b
/c
中其中一个,并且字符串长度是 3 的倍数:
不能写成 /^[abc]{3}+$/
,而是要写成 /([abc]{3})+/
。
- 元字符转义问题
元字符就是正则中的特殊字符,当匹配元字符就需要转义,如:
^
、$
、.
、*
、+
、?
、|
、\
、/
、(
、)
、[
、]
、{
、}
、=
、!
、:
、-
。
// "[abc]" => /\[abc\]/ 或者 /\[abc]/
// "{1,3}" => /\{1\}/ 或者 /\{1}/ 因为不构成字符组
2. 案例分析
- 身份证号码
/^(\d{15}|\d{17})[\dxX]$/.test("390999199999999999");// true
- IPV4地址
需要好好分析:
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])$/