Skip to content

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 字符
正则全称含义
LLetter字母
Lllowercase小写
Lmmodifier修饰
Lttitlecase首字母大写
Luuppercase大写
Loother其他

修饰符

修饰符全称含义
iignore不区分大小写
gglobal搜索所有匹配项
mmulti-line多行模式
s允许 . 匹配 \n
uunicode完整 Unicode 支持
y在指定位置搜索