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
时匹配X
X(?!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 | 在指定位置搜索 |