正则表达式语法一览
字符
.任意字符(除换行)\d数字\w字母、数字、下划线\s空白\D非数字\W非单词字符\S非空白[abc]a、b、c 任一[^abc]除 a、b、c 外[a-z]a 到 z\p{L}任意文字字母(需 u 标志)[\u4e00-\u9fff]中文汉字
位置
^开头$结尾\b单词边界\B非单词边界
数量
*0 次或多次+1 次或多次?0 或 1 次{3}恰好 3 次{2,}至少 2 次{2,5}2 到 5 次*?非贪婪:尽量少
分组与引用
(abc)捕获组(?:abc)不捕获的分组(?<name>abc)命名捕获组\1引用第 1 组\k<name>引用命名组a|ba 或 b
前后断言
(?=abc)后面紧跟 abc(?!abc)后面不是 abc(?<=abc)前面是 abc(?<!abc)前面不是 abc
转义
\.字面的点\/字面的斜杠\n换行\tTab\u00A9Unicode 字符
替换语法
$1 $2第 1、2 个捕获组$<name>命名组$&整个匹配$`匹配之前的文本$'匹配之后的文本$$字面的 $
怎么用
- 在上方输入正则表达式,点亮需要的标志(常用 g 全局、i 忽略大小写)。
- 在测试文本里粘贴内容,匹配会实时高亮,下方列出每个匹配的位置和分组。
- 需要改写文本就切到「替换」,要把所有匹配拿出来用「提取列表」;最后复制对应语言的代码。
常见问题
贪婪和非贪婪有什么区别?
默认的 * + {n,} 是贪婪的,会尽量多匹配;后面加 ? 变成非贪婪,尽量少匹配。例如在文本 x1y x2y 里,x.*y 匹配整段,x.*?y 只匹配到第一个 y。
用的是哪种正则语法?
浏览器的 JavaScript(ECMAScript 2024)语法:支持命名组、前后断言、Unicode 属性 \p{…}。Python、PHP(PCRE)、Java、C# 的大多数写法相同;Go 不支持前后断言和反向引用。下方「代码」会按语言自动改写命名组等差异。
文本会上传吗?
不会。匹配在你浏览器里的独立线程中运行,超过 1 秒自动停止,避免灾难性回溯卡死页面;内容不会发送到任何服务器。