正则表达式
JSPCRE
//
匹配结果
无匹配字符类
| 语法 | 含义 | JS | PCRE | Python | Java |
|---|---|---|---|---|---|
| \d | 数字 [0-9] | ✅ | ✅ | ✅ | ✅ |
| \D | 非数字 [^0-9] | ✅ | ✅ | ✅ | ✅ |
| \w | 单词字符 [a-zA-Z0-9_] | ✅ | ✅ | ✅ | ✅ |
| \W | 非单词字符 | ✅ | ✅ | ✅ | ✅ |
| \s | 空白字符 | ✅ | ✅ | ✅ | ✅ |
| \S | 非空白字符 | ✅ | ✅ | ✅ | ✅ |
| . | 任意字符(除换行) | ✅ | ✅ | ✅ | ✅ |
| [abc] | 字符类(匹配 a/b/c) | ✅ | ✅ | ✅ | ✅ |
| [^abc] | 排除字符类(非 a/b/c) | ✅ | ✅ | ✅ | ✅ |
| [[:alpha:]] | POSIX 字母类 | ❌ | ✅ | ✅ | ❌ |
| [[:digit:]] | POSIX 数字类 | ❌ | ✅ | ✅ | ❌ |
| \p{L} | Unicode 字母 | ✅ | ✅ | ⚠️ | ✅ |
| \p{N} | Unicode 数字 | ✅ | ✅ | ⚠️ | ✅ |
| \X | Unicode 扩展字形簇 | ❌ | ✅ | ❌ | ❌ |
量词
| 语法 | 含义 | JS | PCRE | Python | Java |
|---|---|---|---|---|---|
| * | 零次或多次 | ✅ | ✅ | ✅ | ✅ |
| + | 一次或多次 | ✅ | ✅ | ✅ | ✅ |
| ? | 零次或一次 | ✅ | ✅ | ✅ | ✅ |
| {n} | 恰好 n 次 | ✅ | ✅ | ✅ | ✅ |
| {n,m} | n 到 m 次 | ✅ | ✅ | ✅ | ✅ |
| *? | 零次或多次(懒惰) | ✅ | ✅ | ✅ | ✅ |
| +? | 一次或多次(懒惰) | ✅ | ✅ | ✅ | ✅ |
| ?? | 零次或一次(懒惰) | ✅ | ✅ | ✅ | ✅ |
| {n,m}? | n 到 m 次(懒惰) | ✅ | ✅ | ✅ | ✅ |
| *+ | 零次或多次(占有) | ❌ | ✅ | ❌ | ✅ |
| ++ | 一次或多次(占有) | ❌ | ✅ | ❌ | ✅ |
| ?+ | 零次或一次(占有) | ❌ | ✅ | ❌ | ✅ |
锚点
| 语法 | 含义 | JS | PCRE | Python | Java |
|---|---|---|---|---|---|
| ^ | 字符串开头(多行模式下行首) | ✅ | ✅ | ✅ | ✅ |
| $ | 字符串末尾(多行模式下行尾) | ✅ | ✅ | ✅ | ✅ |
| \b | 单词边界 | ✅ | ✅ | ✅ | ✅ |
| \B | 非单词边界 | ✅ | ✅ | ✅ | ✅ |
| \A | 字符串绝对开头 | ❌ | ✅ | ✅ | ✅ |
| \Z | 字符串绝对末尾(换行前) | ❌ | ✅ | ✅ | ✅ |
| \z | 字符串最末尾(换行后) | ❌ | ✅ | ✅ | ❌ |
| \G | 上一匹配结束位置 | ❌ | ✅ | ✅ | ✅ |
分组与引用
| 语法 | 含义 | JS | PCRE | Python | Java |
|---|---|---|---|---|---|
| (...) | 捕获组 | ✅ | ✅ | ✅ | ✅ |
| (?:...) | 非捕获组 | ✅ | ✅ | ✅ | ✅ |
| (?<name>...) | 命名捕获组(JS/Java 风格) | ✅ | ⚠️ | ✅ | ✅ |
| (?P<name>...) | 命名捕获组(Python 风格) | ❌ | ✅ | ✅ | ❌ |
| \1 | 反向引用第 N 组 | ✅ | ✅ | ✅ | ✅ |
| $1 | 替换中引用第 N 组 | ✅ | ❌ | ❌ | ✅ |
| \k<name> | 命名反向引用 | ✅ | ✅ | ✅ | ✅ |
| (?|...) | 分支重置组 | ❌ | ✅ | ❌ | ❌ |
| (?>...) | 原子组(不回溯) | ❌ | ✅ | ❌ | ✅ |
环视
| 语法 | 含义 | JS | PCRE | Python | Java |
|---|---|---|---|---|---|
| (?=...) | 正向前瞻 | ✅ | ✅ | ✅ | ✅ |
| (?!...) | 负向前瞻 | ✅ | ✅ | ✅ | ✅ |
| (?<=...) | 正向后顾 | ✅ | ✅ | ✅ | ✅ |
| (?<!...) | 负向后顾 | ✅ | ✅ | ✅ | ✅ |
修饰符
| 语法 | 含义 | JS | PCRE | Python | Java |
|---|---|---|---|---|---|
| (?i) | 不区分大小写 | ✅ | ✅ | ✅ | ✅ |
| (?-i) | 区分大小写 | ❌ | ✅ | ❌ | ⚠️ |
| (?m) | 多行模式(^/$ 匹配行首行尾) | ✅ | ✅ | ✅ | ✅ |
| (?s) | 点号通配模式(. 匹配换行) | ✅ | ✅ | ⚠️ | ✅ |
| (?x) | 忽略空白和 # 注释 | ❌ | ✅ | ✅ | ✅ |
| (?i:...) | 内联不区分大小写 | ✅ | ✅ | ❌ | ✅ |
PCRE 高级
| 语法 | 含义 | JS | PCRE | Python | Java |
|---|---|---|---|---|---|
| \K | 重置匹配起点 | ❌ | ✅ | ❌ | ❌ |
| (*SKIP) | 跳过当前匹配 | ❌ | ✅ | ❌ | ❌ |
| (*FAIL) | 强制匹配失败 | ❌ | ✅ | ❌ | ❌ |
| (?(cond)yes|no) | 条件表达式 | ❌ | ✅ | ❌ | ❌ |
| (?R) | 递归匹配整个模式 | ❌ | ✅ | ❌ | ❌ |
| (?1) | 子程序调用第 1 组 | ❌ | ✅ | ❌ | ❌ |