# 正则表达式测试（Regex）

URL: https://shahid09.is-a.dev/zh/tools/regex-tester/
Author: Muhammad Shahid (https://shahid09.is-a.dev/)
免费工具 · 在浏览器中运行

用你的文本测试正则表达式，查看每个匹配、它的位置和捕获分组，还可以测试替换。

**快速解答:** 输入正则表达式，选择修饰符并粘贴文本。工具会列出每个匹配的位置和捕获分组，并显示替换结果，其中 $1 表示第 1 组。它使用浏览器的 JavaScript 引擎，所以在这里可用的写法在 JavaScript 和 TypeScript 中同样可用；大多数简单写法在 Python、Java 和 PHP 中也通用。

## 使用方法

1. **输入表达式.** 不需要两侧的斜杠，例如 \d{3}-\d{4}。
2. **选择修饰符并粘贴文本.** g 查找全部匹配，i 忽略大小写，m 让 ^ 和 $ 匹配每一行。
3. **查看匹配结果.** 每个匹配显示位置和分组；填写替换内容可以看到替换后的文本。

## 示例

查找邮箱地址并捕获用户名和域名：

输入:

```
Pattern: (\w+)@(\w+)\.com   Flags: g
Text:    mail sara@example.com or ali@test.com
```

输出:

```
2 个匹配
1. sara@example.com  @5   $1=sara  $2=example
2. ali@test.com      @25  $1=ali   $2=test
```

## 常见错误及解决方法

- **Invalid regular expression: Unterminated group**: 有一个 ( 没有对应的 )。检查括号数量，或用 \( 匹配括号本身。
- **Invalid regular expression: Nothing to repeat**: *、+ 或 ? 等量词前面没有内容，例如 *abc。要匹配这个字符本身，请写成 \*。
- **只找到了第一个匹配**: g 修饰符没有开启。勾选 g 以查找全部匹配。
- **页面卡住了**: 像 (a+)+$ 这样的嵌套量词，在几乎匹配的文本上会引发灾难性回溯。去掉嵌套或让表达式更具体。

## 常见问题

### g、i、m、s、u 修饰符分别是什么意思？

g 查找所有匹配而不只是第一个；i 忽略大小写；m 让 ^ 和 $ 匹配每行的开头和结尾；s 让 . 也匹配换行；u 启用完整的 Unicode 匹配。

### 为什么只找到一个匹配？

没有 g 修饰符时，JavaScript 找到第一个匹配就停止。请勾选 g。

### 怎么匹配邮箱地址？

实用的写法是 [\w.+-]+@[\w-]+\.[\w.]+。用正则完整验证所有可能的邮箱并不现实，更好的做法是发送确认邮件。

### 替换时怎么使用捕获分组？

把表达式的一部分放进括号，在替换内容里用 $1、$2 等引用。命名分组 (?<year>\d{4}) 用 $<year> 引用。

### 怎么匹配点号或括号本身？

在前面加反斜杠：\. 匹配点号，\( 匹配括号。不加反斜杠时，. 匹配任意字符。

### .* 和 .*? 有什么区别？

.* 是贪婪的，尽量多匹配；.*? 是非贪婪的，尽量少匹配。想在第一个闭合标签或引号处停下时用非贪婪写法。

### 怎么匹配中文字符？

可以用 [\u4e00-\u9fa5] 匹配常用汉字，或者勾选 u 后用 \p{Script=Han} 匹配所有汉字。

### 这里的结果适用于 Python 吗？

大部分适用。基本语法相同，区别包括命名分组（旧版 Python 写作 (?P<name>)）和部分修饰符。

### 为什么有些表达式会让页面卡住？

像 (a+)+ 这样的嵌套量词，在几乎匹配的文本上可能需要指数级时间，这叫灾难性回溯。请简化表达式。

### 我的文本会被上传吗？

不会。正则表达式在你的浏览器中运行。

## 相关内容

- [大小写转换](https://shahid09.is-a.dev/zh/tools/case-converter/)
- [JSON 格式化和校验](https://shahid09.is-a.dev/zh/tools/json-formatter/)
- [URL 编码解码](https://shahid09.is-a.dev/zh/tools/url-encoder-decoder/)
