3. 正则表达式
浙江信息技术高考的时候有一个概念, 在 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 | /\bCha/ |
上述 regex 匹配了以 Cha 的 C 为单词边界(左边只能是空格或者非字母数字字符),
以及 pter 的 p 为非单词边界(左边只能是字母数字字符)
选择与捕获
用 () 将所有选择项括起来, 用 | 分隔每个选择项
例如 123456sjtu1234zju345 这个字符串用 regex /([1-9])([a-z]+)/g (匹配单个数字+多个字符相邻) 来匹配, 那么返回的值是
["6sjtu","4zju"] 这样的数组, 也就是所谓 “相关的匹配会被缓存”
非捕获分组
?: 可以作为非捕获元来消除上面所谓的缓存问题:
也就是 (?:expr2)expr1 中 expr2 参与匹配,但是不参与捕获,即最后输出只有 expr1 的匹配结果
断言
1 | /sjtu(?=[\d+])/g |
这样的匹配只能是 sjtu 本身, 即 expr1(?=expr2) 匹配字符串中 expr1 后面 (包含) 且在 expr2 前面 (不包含) 的字符串
类似的, (?<=expr2)expr1 用来匹配字符串中处在 expr2 后面(不包含)的 expr1 字符串(包含)
而 ?! 就是对 (?=) 的否定做法,即 “不等于匹配”
修饰符
用于改变正则表达式匹配行为的特殊指令
i忽略大小写 (ignore case)g全局匹配 (global)m多行匹配 (multiline)- 在多行字符串中会匹配每一行内
s单行匹配 (dotall)- 在单行字符串中会匹配整个字符串, 包括换行符
uUnicode 匹配 (unicode)- 允许使用 Unicode 字符集进行匹配
引用 reference
往往会结合 分组 (捕获) 来进行引用, 即先通过分组匹配到一个字符串数组,然后可以作为重复的匹配而省略
1 | /(\w+) \1 |
上述字符串匹配了两个相同的单词用一个空格间隔的词, 词的内容是匹配数组的第一个字符串内容
