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