正则表达式
正则基础
直接值
任意直接值,例如 /abc/, /你好/
量词:*, ?, +, {n}, {n,}, {n,m}
| 量词 | 含义 | 示例 | 等价于 |
|---|---|---|---|
{n} / {n,} / {n,m} | 匹配前面子表达式 n 次、至少 n 次、n 到 m 次 | 'o{2}' 匹配 "food" 中两个 o,但不能匹配 "Bob" 中一个 o | —— |
* | 零次或多次 | zo* 可匹配 "z", "zoo" | {0,} |
? | 零次或一次 | do(es)? 匹配 "do" 或 "does" | {0,1} |
+ | 一次或多次 | zo+ 匹配 "zo", "zoo",但不能匹配 "z" | {1,} |
位置锚点:^, $, \b, \B
| 锚点 | 含义 |
|---|---|
^ | 开头锚点 |
$ | 尾位置锚点 |
\b, \B | 单词边界 / 非单词边界 • \b:匹配单词边界(空格、标点、换行等)• \B:非单词边界 |
元字符:\w, \W, \d, \D, \s, \S
| 符号 | 含义 |
|---|---|
\s | 匹配空白字符(空格、制表符、换行等) |
\S | 匹配非空白字符 |
\w | 匹配单词字符(字母、数字、下划线)≈ [A-Za-z0-9_] |
\W | 匹配非单词字符 |
\d | 匹配数字 ≈ [0-9] |
\D | 匹配非数字 |
\b | 单词边界 |
\B | 非单词边界 |
分组与逻辑
() 分组
| 符号 | 功能 |
|---|---|
() | 分组,用于捕获或组合模式,例如 (y | ies) 表示“y”或“ies” |
字符集合 []
| 语法 | 含义 |
|---|---|
[xyz] | 匹配其中任一字符 |
[^xyz] | 匹配不在集合中的字符 |
[a-z] | 匹配 a 到 z 的任意小写字母 |
[A-Z] | 匹配 A 到 Z 的任意大写字母 |
[a-zA-Z] | 匹配任意字母 |
[0-9] | 匹配任意数字 |
[0-9a-zA-Z_] | 匹配任意字母、数字、下划线 |
或运算 |
| 或运算,匹配左右任意一个表达式
修饰符
i g常用
| 修饰符 | 含义 |
|---|---|
i | 忽略大小写 |
g | 全局匹配,查找所有匹配而非第一个 |
构造方式
/pattern/
js
let reg1 = /abc/i; // 匹配 "abc",忽略大小写
let reg2 = /[abc]/gi; // 匹配 a、b、c 中任意一个,全局且忽略大小写RegExp
js
new RegExp("abc", "ig"); // 等价于 /abc/ig
new RegExp("[abc]", "ig");应用方法
test(), exec() —— 正则对象方法
| 方法 | 功能 |
|---|---|
regExp.test(str) | 测试字符串是否匹配,返回 true/false |
regExp.exec(str) | 执行匹配,返回匹配结果数组(含分组),无匹配则返回 null |
字符串匹配
| 方法 | 功能 |
|---|---|
str.replace(reg, replacement) | 替换匹配部分 |
str.split(reg) | 按正则分割字符串 |
str.search(reg) | 查找首次匹配的位置,返回索引,未找到返回 -1 |
str.match(reg) | 找到所有匹配项,返回数组(全局模式下) |
断言(很少使用,略)
| 断言 | 说明 | 示例 |
|---|---|---|
(?=pattern) | 正向肯定预查(lookahead) 在当前位置之后必须匹配 pattern,但不包含它 | "Windows(?=95|98|NT|2000)" 匹配 "Windows" 后跟指定版本 |
(?!pattern) | 正向否定预查(negative lookahead) 后边不能出现 pattern | "Windows(?!2000)" 匹配 "Windows" 但排除 "Windows2000" |
(?<=pattern) | 反向肯定预查(lookbehind) 前边必须是 pattern | (?<=3\.1)Windows 匹配 "3.1Windows" 中的 Windows |
(?<!pattern) | 反向否定预查(negative lookbehind) 前边不能是 pattern | (?<!3\.1)Windows 不匹配 "3.1Windows" 中的 Windows |