RegExp
正则表达式由模式 (pattern) 和修饰符 (flag) 组成。
创建正则表达式:
- 字面量:
/pattern/flags- 需要转义正斜杠,不需要转义反斜杠
- 不支持变量插值,无法组合已有的正则表达式
- RegExp 构造函数:
new RegExp('pattern', 'flags')- pattern 字符串需要转义反斜杠,不需要转义正斜杠
- 允许将多个正则字符串组合为更长的正则表达式
模式
^匹配开头,$匹配结尾- 使用修饰符
m后匹配每一行的开头和结尾
- 使用修饰符
\b匹配词边界,也就是一侧有\w、另一侧没有\w- 字符类表示特定类别的一个字符
| 字符类 | 含义 |
|---|---|
\d (digit) | 数字 |
\s (space) | 空白符:空格、\t、\n、\v、\f、\r 等 |
\w (word) | “单字”:字母、数字、下划线 _ |
\D | \d 反向类,非数字 |
\S | \S 反向类,非空白符 |
\W | \w 反向类,非字母、数字、下划线 |
. | 除 \n 外任何字符 |
- 集合
[xxx]表示方括号中字符中的任意一个- 集合可以包含范围,比如
[a-z]、[A-Z]、[0-9] - 集合开头加上
^表示除方括号中字符之外的任意字符 - 除了集合中有特殊含义的字符,其他特殊字符都不需要转义
- 需要转义的字符:
- 开头的
^ - 中间的
- - 右方括号
]
- 开头的
- 集合可以包含范围,比如
|表示或- 捕获组 (capturing group) 是用圆括号
()括起来的部分- 没有
g修饰符的匹配结果数组会包含每个组的匹配结果,按照从左到右、从外到内的顺序编号 - 左括号后紧跟
?<name>为组命名,通过res.groups.name访问 - 如果必须使用捕获组但不希望出现在匹配结果里,在开头添加
?: - 在正则中使用
\N和\k<name>引用前面出现的组
- 没有
- 量词表示匹配的字符数量
- 确切数量:
{n} - 数量范围:
{lo, hi}闭区间,hi省略表示无限 - 简写:
?:{0,1}*:{0,}+:{1,}
- 量词匹配默认是贪婪的 (greedy),尽可能多地匹配字符,直到不满足条件再回溯
- 在量词后添加问号
?启用惰性量词 (lazy)- 比如
??、*?、+? - 尽可能少地匹配字符,每次匹配成功后就停下来尝试匹配剩余部分
- 比如
- 确切数量:
- 前瞻断言 lookahead (看右边)
X(?=Y):仅在后面是Y时匹配XX(?!Y):仅在后面不是Y时匹配X
- 后瞻断言 lookbehind (看左边)
(?<=Y)X:仅在前面是Y时匹配X(?<!Y)X:仅在前面不是Y时匹配X
- 转义
- 特殊字符
[ ] { } ( ) \ ^ $ . | ? * +使用反斜杠\进行转义 - 正则字面量需要转义
/,普通字符串需要转义\
- 特殊字符
\p{}和修饰符u匹配 Unicode 字符
| 正则 | 全称 | 含义 |
|---|---|---|
L | Letter | 字母 |
Ll | lowercase | 小写 |
Lm | modifier | 修饰 |
Lt | titlecase | 首字母大写 |
Lu | uppercase | 大写 |
Lo | other | 其他 |
修饰符
| 修饰符 | 全称 | 含义 |
|---|---|---|
| i | ignore | 不区分大小写 |
| g | global | 搜索所有匹配项 |
| m | multi-line | 多行模式 |
| s | 允许 . 匹配 \n | |
| u | unicode | 完整 Unicode 支持 |
| y | 在指定位置搜索 |