RegexSmith
在编写正则表达式的地方直接解释和测试它。悬停在 C# 中的模式上:每一部分用一行通俗文字说明,组以颜色标出,并给出能匹配的字符串;可能卡死的模式会加下划线;在 RegexSmith 测试器中用自己的示例试验,一键把模式写回代码。
免费 · Visual Studio 2022 和 2026 · 14 种界面语言 · 无遥测
为什么选择 RegexSmith
![[GeneratedRegex] 模式上方的悬停卡片:组以颜色标出的模式、每一部分一行的通俗说明、能匹配的示例和一个不匹配的示例,以及状态“✓ 安全”](../../regexsmith/marketplace/hero.png)
通俗文字,而不是语法课
^(?<year>\d{4})-(?<id>\d{1,5})$ 会变成“文本开头”“恰好 4 个数字”“1 到 5 个数字”——每一部分一行,嵌套在所属组下,每个组都有自己的颜色。
由真正的引擎检查
卡片中的示例和测试器中的每个结果都直接来自 .NET 正则表达式引擎,并使用调用中的选项。你看到的就是你的应用会做的。
可能卡死的模式
([a-z0-9]+\.?)+ 看似无害,却可能在一个几乎匹配的长字符串上让请求卡住。RegexSmith 会为这类重复加下划线,并通过 Ctrl+. 修复它们。
免费,没有附加条件
没有订阅、没有“Pro”版、不收集数据,也不会在“输出”窗口或启动时显示消息。模式和示例只保存在你的计算机上。我们唯一的请求是:在你用过一段时间之后,到 Marketplace 给个评分。支持 Visual Studio 2022 和 2026,x64 和 ARM64。
功能
- C# 中模式上方的悬停卡片:组以颜色标出的模式、每一部分一行的通俗说明、彩色的组标签和状态——✓ 安全、⚠ 可能挂起或✕ 无效。
- 组下划线:直接在代码中每个捕获组下方画一条该组颜色的细线;嵌套的组位置更低。
- 由模式生成的示例——两个能匹配的字符串和一个不匹配的字符串——由真正的 .NET 引擎检查。
- RX001:在可能耗费指数级时间的重复下方显示波浪线,Ctrl+. 中提供修复及修改前后的预览。
- 停靠在“查找结果”旁边的 RegexSmith 测试器:带 ✓/✗ 预期的示例、高亮显示的匹配和组、组表格以及替换选项卡。
- 应用到代码:编辑后的模式连同选项写回同类字符串字面量,可一次撤消。
- 复制为单元测试,支持 xUnit、NUnit 或 MSTest——你的示例会变成测试用例。
悬停卡片
悬停在模式字符串上,Visual Studio 的常规工具提示中会多出一张 RegexSmith 卡片:模式的含义、它匹配什么,以及它是否安全。

适用范围
在 C# 文件中,以下各项的模式上:
new Regex("…"),带或不带RegexOptions;- 静态方法
Regex.IsMatch、Match、Matches、Replace、Split和Count; [GeneratedRegex("…")];[RegularExpression("…")]——此时卡片会显示验证:整个值必须匹配;- 同一文件中被上述某一项使用的
const string。
常规字符串、逐字字符串(@"…")和原始字符串("""…""")都按编译器的方式读取,因此 "\\d" 和 @"\d" 是同一个模式。
卡片显示的内容
| 屏幕上 | 含义 |
|---|---|
| RegexSmith · .NET 正则表达式 · IgnoreCase | 模式的类型和从调用中读取的选项,右侧是状态。 |
| 模式 | 每个捕获组的括号使用其颜色,内部以该颜色加下划线;文本保持主题颜色,因此依然易读。 |
| 恰好 4 个数字 | 每一部分一行通俗说明——“文本开头”“以下文本之一:‘jpg’、‘png’”“1 到 5 个数字”——嵌套在所属组下。很长的模式以 … 另有 N 行结尾。 |
| 组标签 | 每个组的名称或编号显示在其颜色的标签上——与模式中和代码下方的颜色相同。 |
| ✓ 匹配:… ✗ 不匹配:… | 两个能匹配的字符串和一个不匹配的字符串,由模式生成并经真正的 .NET 引擎检查。空格显示为浅色圆点。 |
| ▶ 测试模式… | 在 RegexSmith 测试器中打开该模式。 |
状态
| 屏幕上 | 含义 |
|---|---|
| ✓ 安全 | .NET 接受该模式,且其中没有任何部分会发生灾难性回溯。 |
| ⚠ 可能挂起 | 某个重复在几乎匹配的长输入上可能耗费指数级时间;卡片会说明属于哪一类(RX001),并提示 Ctrl+. 提供修复。 |
| ✕ 无效 | 引擎拒绝了该模式;卡片会显示其消息:.NET 不接受此模式:… |
“安全”仅表示:.NET 接受该模式,且它不会卡死。并不表示它匹配你想要的内容——这正是示例和测试器的用途。
组下划线
模式中的每个捕获组都会直接在代码中获得一条其颜色的细线——与卡片中的颜色相同。一个有五个组的长模式一眼就能看懂:哪部分是年份,哪部分是编号。
位于另一个组内部的组会稍低一些,这样两条线都可见。颜色依次为:鲑红、绿、蓝、紫、琥珀、青——然后循环。
可以在设置中关闭下划线:为捕获组加下划线。
可能卡死的模式
有些模式在几乎匹配的长字符串上会耗费指数级时间——这正是正则表达式让 Web 请求卡住的典型方式。RegexSmith 根据形态识别它们,并在重复下方加上警告波浪线;悬停即可查看原因。
![([a-z0-9]+\.?)+ 下方的 RX001 波浪线,Ctrl+. 菜单已打开,并显示修复预览:旧模式被划掉,新模式使用原子组](../../regexsmith/marketplace/backtracking.png)
哪些会被加下划线(RX001)
- 嵌套重复:
(a+)+、([a-z0-9]+\.?)+——同一串字符可以用非常多种方式在内层和外层重复之间拆分。 - 重复的可选项匹配相同字符:
(\w|\d)+——一个数字可以被任一分支匹配,因此每多一个数字,工作量就翻倍。
原子组或环视内部不会标记,使用 RegexOptions.NonBacktracking 时也从不标记——那里不会发生这种情况。
Ctrl+. 中的修复
将光标放在波浪线上并按 Ctrl+.——每个修复都会显示预览:修改前(划掉)和修改后的模式。
| 修复 | 作用 |
|---|---|
| 将内部重复设为原子:(?>…) | 用 (?>…) 包住内部重复。匹配的字符串相同;重复不再能以多种方式拆分。 |
| 使用 RegexOptions.NonBacktracking (.NET 7+) | 将该选项添加到调用中。对任何输入都是线性时间;需要 .NET 7 或更高版本。仅在模式允许时提供——不能有反向引用、环视、原子组或平衡组、条件。 |
| 在 RegexSmith 中测试此模式 | 在测试器中打开该模式——任何模式上都会提供,而不仅仅是有风险的模式。 |
可在设置(编辑器中的提示)中或通过工具提示中的不再显示此类提示关闭 RX001;Ctrl+. 中的修复仍可使用。
测试器
RegexSmith 测试器打开时停靠在“查找结果”旁边。模式来自代码并与之保持关联:用你自己的示例试验、修改,然后写回。

打开方式
- 悬停卡片中的 ▶ 测试模式…;
- 在模式上按 Ctrl+. › 在 RegexSmith 中测试此模式;
- 在 C# 文件中右键单击 › 测试正则表达式模式;
- 视图 › 其他窗口 › RegexSmith 测试器——不与代码关联:一个试验模式的地方。
模式及其选项
顶部显示模式所在的文件和行——单击即可跳转。下方是模式框、状态行(✓ 安全、⚠ 可能挂起或引擎的错误,然后是 N/M 符合预期 · ms)以及选项标签:IgnoreCase、Multiline、Singleline、IgnorePatternWhitespace、ExplicitCapture、RightToLeft、CultureInvariant。每次更改都会立即重新运行。
示例和预期
第一次打开时,卡片中的示例已经在那里:两个应当匹配,一个不应当匹配。在添加示例并按 Enter…中输入新的示例;单击示例可编辑,✕ 可删除。每个示例前的标记表示它应有的结果——单击可更改:
| 屏幕上 | 含义 |
|---|---|
| ✓ | 应匹配 |
| ✗ | 不应匹配 |
| – | 无预期,仅显示 |
结果与预期相反的示例会变红——✗ 匹配或✗ 不匹配——这样示例就成了模式的一份小规范。匹配部分着色,组以各自颜色加下划线,空格显示为圆点。运行超过 1 秒会停止并显示 ⏱ 太慢。
所选示例的分组列出所选示例的每个匹配:先是整个匹配,然后是每个组及其值和位置(未参与匹配时显示未捕获)。
替换
替换选项卡会添加一个替换框——$1、${name},$$ 表示 $——并按 Regex.Replace 的方式显示每个示例的结果。
复制、还原、应用
复制为单元测试会把包含你的示例的测试放到剪贴板上,支持 xUnit、NUnit 或 MSTest——规范就此移入测试项目。
还原会回到代码中的模式和选项;示例保留。
应用到代码会把模式连同选项按原来的字面量类型(常规、逐字或原始)写回——一次撤消即可恢复。如果测试器打开后那段代码发生了变化,则不会写入任何内容:请从模式重新打开测试器。
示例按模式和解决方案记录在 %LocalAppData%\RegexSmith\samples 中,下次打开时它们已经在那里。不会向存储库写入任何内容。
设置
工具 › 选项 › SmithWorks › RegexSmith。每个选项都有简短说明,介绍它的作用。
| 选项 | 默认值 |
|---|---|
| 悬停时解释模式 | 开 |
| 为捕获组加下划线 | 开 |
| RX001 灾难性回溯 | 开 |
| 请求在 Marketplace 上评分 | 开 |
底部有重置为默认值、文档、在 Marketplace 上评价和发送反馈。
设置保存在 %LocalAppData%\RegexSmith 中。

常见问题
RegexSmith 会发送任何数据吗?
不会。模式从打开的文档中读取并在你的计算机上运行;示例保存在 %LocalAppData%\RegexSmith 中。没有网络请求,也没有遥测。
卡片显示“✓ 安全”。这个模式正确吗?
不一定。“安全”表示 .NET 接受该模式,且其中没有任何重复会发生灾难性回溯。它是否匹配你想要的内容要靠示例来体现:在测试器中把它们标记为 ✓ 或 ✗。
为什么我的模式上没有卡片?
卡片出现在 RegexSmith 能识别为模式的字符串字面量上:new Regex、静态 Regex 方法、[GeneratedRegex] 或 [RegularExpression] 的参数,或在这些位置使用的同一文件中的常量。运行时构建的模式(拼接而成、从设置读取)无法读取。另外,请检查设置中的悬停时解释模式。
使用的是哪个正则表达式引擎?
Visual Studio 自身所运行的 .NET 正则表达式引擎,并使用调用中的选项。RegexOptions.NonBacktracking(.NET 7+)也会从调用中读取;此时示例在常规引擎上运行,两种方式匹配的字符串相同。
“应用到代码”没有任何效果。
测试器打开后,模式所在的代码发生了变化,因此 RegexSmith 不会写入一个可能已不再包含该模式的位置——测试器会在按钮下方说明这一点。请从模式重新打开测试器。如果代码中没有放置选项的位置([RegularExpression] 不接受选项),则只写入模式,不写入选项。
它支持 VB.NET、JavaScript 或 TypeScript 吗?
1.0 不支持:仅支持 C#。其他语言使用其他引擎;如有需要,请在 Feedback 仓库中提出。
在哪里报告问题或提出功能建议?
请在 GitHub 上的 Feedback 仓库中提交 issue——那里有用于报告错误和提出建议的表单(如有私密名称,请先替换)。也可以使用 Marketplace 上的 Q&A 选项卡。
更新日志
1.0.1
- 编辑器中的提示在选项页上有了自己的列表,工具提示中的链接可就地关闭某类提示。
1.0.0
- 首个版本:带通俗说明、彩色组、经 .NET 引擎检查的示例和状态的悬停卡片;代码中的组下划线;针对可能卡死的模式的 RX001,并在 Ctrl+. 中提供原子组和 NonBacktracking 修复;带预期、组、替换、复制为单元测试和应用到代码的 RegexSmith 测试器;一次性的评分请求。