什么是正则表达式?
正则表达式(Regex)是用来描述文本的规则,例如“四个数字、一个连字符、两个数字”。开发中常用来校验输入、搜索日志、提取数据或批量替换文本。这个工具使用浏览器内置的 JavaScript 引擎,结果和浏览器、Node.js 中 String.prototype.match 与 replace 的结果一致。
使用方法
- 输入表达式(不用加前后的斜杠),勾选需要的修饰符。
- 粘贴要测试的文本,每个匹配处都会标出来;相邻的匹配用不同颜色,方便区分。
- 表格列出每个匹配的位置与捕获组。点击某一行,就会在文本中选中该处。
- 填写“替换为”即可预览替换结果。捕获组用
$1、$<name>,整段匹配文本用$&。
示例:转换日期格式
表达式 (?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2}) 会找出 2024-03-15 这类日期,并给三个部分命名。替换为 $<day>/$<month>/$<year> 的结果是:
15/03/2024
常用语法
| 语法 | 含义 |
|---|---|
\d | 一个数字 0-9 |
\w | 英文字母、数字或下划线 |
\s | 空白字符:空格、Tab、换行 |
. | 换行以外的任何字符(开启 s:任何字符) |
* + ? | 0 次以上、1 次以上、0 或 1 次 |
{2,4} | 2 到 4 次 |
^ $ | 文本的开头与结尾(开启 m:每一行) |
\b | 单词边界 |
[abc] [^abc] | a、b、c 其中一个/除此之外的字符 |
a|b | a 或 b |
(...) | 捕获组:替换时用 $1、$2 |
(?:...) | 只分组、不捕获 |
(?<name>...) | 命名捕获组:替换时用 $<name> |
(?=...) (?!...) | 后面紧跟/后面不是(先行断言) |
常见问题
这里用的是哪种正则表达式?
JavaScript(ECMAScript),与浏览器、Node.js 相同。大部分语法在 Java、Python、PHP、Go 中也通用,但有一些差异:Python 的命名捕获组写作 (?P<name>...);写在表达式开头的 (?i) 这类修饰符这里不支持,请改用修饰符复选框。
为什么测试中途提示超时?
有些表达式,特别是 (a+)+$ 这种重复里嵌套重复的写法,会让引擎尝试极大量的组合(称为“灾难性回溯”)。这个工具在后台运行,超过 2 秒就停止,页面不会卡死。请改写表达式、避免嵌套重复,同样的表达式也可能让你的服务器卡死。
反斜杠要写两个吗?
在这里不用,直接输入 \d。复制到 Java、C# 或 JavaScript 代码的字符串里(不是 /.../ 写法)时,每个反斜杠都要写两次,例如 "\\d{4}"。
文本会发送到服务器吗?
不会。匹配与替换全部在你的浏览器中运行,可以放心用不能外传的日志或数据来测试。