什么是正则表达式
正则表达式(Regular Expression,简称 regex)是一套描述字符串匹配规则的语法。用一个简短的"模式字符串",就能表达"查找所有邮箱地址""匹配所有以 1 开头的 11 位数字""把 HTML 标签去掉"等复杂需求。
// 例:匹配中国大陆手机号(简化版)
正则:1[3-9]\d{9}
// 在文本中会匹配到:
13912345678 ← 匹配
18887654321 ← 匹配
12345678901 ← 不匹配(不是 1 开头)
几乎所有编程语言(JavaScript、Python、Java、Go、PHP 等)都内置正则引擎,写一次正则可以在代码、编辑器搜索、命令行工具(grep、sed)中复用。但正则有自己的一套"暗号"语法,初学者容易写错。在线测试工具的价值就在于:每敲一个字符,立刻看到匹配结果。
在线测试正则表达式的步骤
- 打开 正则表达式测试工具,在「正则表达式」输入框中编写你的模式。
- 在「测试文本」区域粘贴你需要搜索的文本内容。
- 匹配结果实时高亮显示在测试文本中,右侧列出所有匹配项和捕获组。
- 如果需要替换,切换到「替换」标签,输入替换内容(支持 $1、$2 反向引用),预览效果后复制。
所有操作在浏览器本地运行,测试文本不会被上传到任何服务器。
核心功能一览
实时高亮匹配
输入正则的同时即时在测试文本中高亮所有匹配内容,所见即所得。
分组捕获提取
用括号分组的子匹配项单独列出,方便提取邮箱的用户名和域名等。
替换与反向引用
支持 $1、$2 等反向引用,在替换中引用捕获到的内容。
常用模式模板
内置邮箱、手机号、URL、身份证号等常用正则,一键插入修改。
常用正则速查表
| 用途 | 正则表达式 | 说明 |
|---|---|---|
| 邮箱 | \w+@\w+\.\w+ | 基础版,匹配 user@domain.com |
| 手机号(中国) | 1[3-9]\d{9} | 1 开头 + 第二位 3-9 + 9 位数字 |
| URL | https?://[^\s]+ | 匹配 http 或 https 开头的链接 |
| 身份证号(18位) | \d{17}[\dXx] | 17 位数字 + 数字或 X |
| IP 地址 | \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} | 基础匹配,需配合范围校验 |
| 中文汉字 | [一-龥]+ | 匹配连续的中文字符 |
贪婪匹配 vs 懒惰匹配:一个常见的坑
文本:<div>标题</div><div>内容</div>
贪婪匹配:<.*>
结果:匹配整行 <div>标题</div><div>内容</div>(全吃掉了!)
懒惰匹配:<.*?>
结果:分别匹配 <div>、</div>、<div>、</div>
默认的 * 和 + 是贪婪的,会尽可能多地匹配。在量词后加 ? 变成懒惰匹配。从 HTML 中提取标签内容时,用懒惰匹配才能正确拆出每个标签。
常见应用场景
- 表单校验:用正则在前端对用户输入的邮箱、手机号、邮政编码做格式校验,减少无效提交。
- 日志分析:从海量日志中用正则提取 IP 地址、时间戳、错误码,配合 grep 或脚本统计。
- 数据清洗:用替换功能批量去除文本中的 HTML 标签、多余空白、特殊字符。
- 代码重构:在 IDE 中用正则查找替换,批量修改变量命名、调整 import 语句。
- 爬虫解析:从网页源码中用正则提取特定字段(但复杂 HTML 建议用解析器)。
常见问题 FAQ
正则表达式匹配不到内容怎么排查?
推荐分步调试法:①用最简单的字面字符(如单个字母)确认匹配流程正常;②逐步增加模式复杂度,每改一处看匹配变化;③检查元字符是否正确转义(点号、括号、加号等需反斜杠转义);④注意不同语言的引擎差异,比如 JavaScript 不支持后行断言(ES2018 后已支持),grep 默认是 BRE 而非 ERE。
分组捕获和普通括号有什么区别?
用 (pattern) 会创建捕获组,匹配结果可通过 $1、$2 反向引用。若只想用括号控制优先级但不捕获,用 (?:pattern) 非捕获分组可以提升性能。零宽断言(如 (?=...) 正向先行断言)只检查位置不消耗字符,常用于"后面必须跟着什么"但不包含在匹配结果中的场景。
在线正则测试工具安全吗?
速工具 的正则测试完全在浏览器本地运行,测试文本和正则表达式不会上传到任何服务器。但注意不要在测试文本中粘贴真实的敏感数据——虽然不上传,浏览器环境中可能被其他已加载的脚本读取。
贪婪匹配和懒惰匹配有什么区别?
贪婪匹配(.*、.+)会尽可能多地匹配字符;懒惰匹配(.*?、.+?)则尽可能少地匹配。提取一对标签之间的内容时,用 <tag>(.*?)</tag> 是正确的,用 <tag>(.*)</tag> 则可能从第一个标签开头吃到最后一个标签结尾。