LazowskiAnton · Extensions

RegexSmith

在编写正则表达式的地方直接解释和测试它。悬停在 C# 中的模式上:每一部分用一行通俗文字说明,组以颜色标出,并给出能匹配的字符串;可能卡死的模式会加下划线;在 RegexSmith 测试器中用自己的示例试验,一键把模式写回代码。

免费 · Visual Studio 2022 和 2026 · 14 种界面语言 · 无遥测

为什么选择 RegexSmith

[GeneratedRegex] 模式上方的悬停卡片:组以颜色标出的模式、每一部分一行的通俗说明、能匹配的示例和一个不匹配的示例,以及状态“✓ 安全”

通俗文字,而不是语法课

^(?<year>\d{4})-(?<id>\d{1,5})$ 会变成“文本开头”“恰好 4 个数字”“1 到 5 个数字”——每一部分一行,嵌套在所属组下,每个组都有自己的颜色。

由真正的引擎检查

卡片中的示例和测试器中的每个结果都直接来自 .NET 正则表达式引擎,并使用调用中的选项。你看到的就是你的应用会做的。

可能卡死的模式

([a-z0-9]+\.?)+ 看似无害,却可能在一个几乎匹配的长字符串上让请求卡住。RegexSmith 会为这类重复加下划线,并通过 Ctrl+. 修复它们。

免费,没有附加条件

没有订阅、没有“Pro”版、不收集数据,也不会在“输出”窗口或启动时显示消息。模式和示例只保存在你的计算机上。我们唯一的请求是:在你用过一段时间之后,到 Marketplace 给个评分。支持 Visual Studio 2022 和 2026,x64 和 ARM64。

功能

悬停卡片

悬停在模式字符串上,Visual Studio 的常规工具提示中会多出一张 RegexSmith 卡片:模式的含义、它匹配什么,以及它是否安全。

悬停卡片:显示类型和选项的标题、组以颜色标出的模式、嵌套在组下的每一部分一行的说明、示例以及“测试模式”按钮

适用范围

在 C# 文件中,以下各项的模式上:

常规字符串、逐字字符串(@"…")和原始字符串("""…""")都按编译器的方式读取,因此 "\\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+. 菜单已打开,并显示修复预览:旧模式被划掉,新模式使用原子组

哪些会被加下划线(RX001)

原子组或环视内部不会标记,使用 RegexOptions.NonBacktracking 时也从不标记——那里不会发生这种情况。

Ctrl+. 中的修复

将光标放在波浪线上并按 Ctrl+.——每个修复都会显示预览:修改前(划掉)和修改后的模式。

修复作用
将内部重复设为原子:(?>…)用 (?>…) 包住内部重复。匹配的字符串相同;重复不再能以多种方式拆分。
使用 RegexOptions.NonBacktracking (.NET 7+)将该选项添加到调用中。对任何输入都是线性时间;需要 .NET 7 或更高版本。仅在模式允许时提供——不能有反向引用、环视、原子组或平衡组、条件。
在 RegexSmith 中测试此模式在测试器中打开该模式——任何模式上都会提供,而不仅仅是有风险的模式。

可在设置(编辑器中的提示)中或通过工具提示中的不再显示此类提示关闭 RX001;Ctrl+. 中的修复仍可使用。

测试器

RegexSmith 测试器打开时停靠在“查找结果”旁边。模式来自代码并与之保持关联:用你自己的示例试验、修改,然后写回。

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 选项页
选项页。

常见问题

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