浙江信息技术高考的时候有一个概念, 在 excel 中可以通过 ? 来匹配一个字符, * 来匹配多个字符;正则表达式拥有比 ?* 更强大的功能, 能够匹配更复杂的字符串模式;

简介

正则表达式具有几类字符类型

元字符

元字符具有特殊的含义, 例如 \d 匹配任意数字字符, \w 匹配任意字母数字字符, . 匹配任意字符(除了换行符)等

量词

  • * 匹配前一个字符零次或多次
  • + 匹配前一个字符一次或多次
  • ? 匹配前一个字符零次或一次
  • {n} 匹配前一个字符恰好 n 次
  • {n,} 匹配前一个字符至少 n 次
  • {n,m} 匹配前一个字符至少 n 次, 不超过 m 次

字符类

  • [ ] 匹配括号内任意一个字符, 例如 [abc] 匹配 a, b, c 中的任意一个字符
  • [^ ] 匹配不在括号内的任意一个字符, 例如 [^abc] 匹配除 a, b, c 以外的任意一个字符

边界匹配

  • ^ 匹配字符串的开头
  • $ 匹配字符串的结尾
  • \b 匹配单词边界
  • \B 匹配非单词边界

分组和捕获

  • ( ) 用于分组, 可以将多个字符组合在一起, 例如 (abc) 匹配字符串 “abc”
  • (?: ) 用于非捕获分组, 只用于分组而不捕获匹配结果

特殊字符

  • \ 转义字符, 用于匹配特殊字符本身
  • . 匹配任意字符 (除了换行符)
  • | 用于指定多个模式的选择

语法

普通字符

  • [\s\S] \s匹配所有空白字符, 包括换行符; \S 匹配所有非空白字符, 不包括换行
  • \w 匹配字符, 数字, 下划线; 等价于 [A-Za-z0-9_]
  • \d 匹配阿拉伯数字, 等价于 [0-9]

非打印字符的转义

  • \cx 匹配由 x 知名的控制字符, 即 x 可以为多种字符为 A-Z,a-z 范围之一, 否则会将 c 视为 普通字符
    • \cx 一般等价于 \C-x 指令, 或者 Control-x 指令, 在计算机解释过程中表现为 x 的 ASCII 码减去 0x40
  • \f 匹配一个换页符, 等价于 \x0c\cL
    • 这里的 \x0c 表示的是 ASCII 码中 0x0c=12 的控制字符, 即换页符
  • \n 匹配一个换行符 (光标移动到下一行同一列), 等价于 \x0a\cJ
  • \r 匹配一个回车符 (光标水平移动到行首), 等价于 \x0d\cM
  • \t 匹配一个制表符 (Tab), 等价于 \x09\cI
  • \v 匹配一个垂直制表符, 等价于 \x0b\cK
  • \s 匹配任何空白(包括不显示)字符, 等价于 [\f\n\r\t\v]

定位符

不能把定位符 ^, $, \b, \B 和 限定符*, +, ?, {n}, {n,}, {n,m} 相邻处理

1
/^Chapter [1-9]?[0-9]{0,1}$/

上述 regex 匹配了以 Chapter 开头的一行, 并且结尾必须是 0 个或者 1 个 0-9 的数字

1
2
/\bCha/
/\Bpter/

上述 regex 匹配了以 Cha 的 C 为单词边界(左边只能是空格或者非字母数字字符),
以及 pter 的 p 为非单词边界(左边只能是字母数字字符)

选择与捕获

() 将所有选择项括起来, 用 | 分隔每个选择项

例如 123456sjtu1234zju345 这个字符串用 regex /([1-9])([a-z]+)/g (匹配单个数字+多个字符相邻) 来匹配, 那么返回的值是
["6sjtu","4zju"] 这样的数组, 也就是所谓 “相关的匹配会被缓存”

非捕获分组

?: 可以作为非捕获元来消除上面所谓的缓存问题:

也就是 (?:expr2)expr1expr2 参与匹配,但是不参与捕获,即最后输出只有 expr1 的匹配结果

断言

1
/sjtu(?=[\d+])/g

这样的匹配只能是 sjtu 本身, 即 expr1(?=expr2) 匹配字符串中 expr1 后面 (包含) 且在 expr2 前面 (不包含) 的字符串

类似的, (?<=expr2)expr1 用来匹配字符串中处在 expr2 后面(不包含)的 expr1 字符串(包含)

?! 就是对 (?=) 的否定做法,即 “不等于匹配”

修饰符

用于改变正则表达式匹配行为的特殊指令

  • i 忽略大小写 (ignore case)
  • g 全局匹配 (global)
  • m 多行匹配 (multiline)
    • 在多行字符串中会匹配每一行内
  • s 单行匹配 (dotall)
    • 在单行字符串中会匹配整个字符串, 包括换行符
  • u Unicode 匹配 (unicode)
    • 允许使用 Unicode 字符集进行匹配

引用 reference

往往会结合 分组 (捕获) 来进行引用, 即先通过分组匹配到一个字符串数组,然后可以作为重复的匹配而省略

1
/(\w+) \1

上述字符串匹配了两个相同的单词用一个空格间隔的词, 词的内容是匹配数组的第一个字符串内容