Command Palette

Search for a command to run...

正規表示式解釋器:將正規表示式轉換為普通英語

正規表示式解釋器:將正規表示式轉換為普通英語

T
Toolz Team
|Aug 23, 2026|15 閱讀

正規表示式 合集的一部分

花我最多時間的正規表示式是我沒有寫的。它已經四歲了,坐在驗證層裡,看起來就像一隻貓走過鍵盤:嵌套組、前瞻、兩個字元類別和一個 {2,} 隱藏在最後。一張支援票說它拒絕有效的輸入,在我修復它之前,我必須理解它,這意味著在精神上一次一個令牌地運行該模式上的引擎。這是每個開發商為不熟悉的正規表示式繳納的稅金,而這正是稅金 正規表示式解釋器 在 toolz。dev 上建置是為了刪除。本指南是關於閱讀正規表示式而不是解碼它們,以及逐個令牌的分解如何將符號牆變成您可以像普通程式碼一樣查看的東西。

TL;DR: 正規表示式解釋器解析正規表示式並用簡單的英語描述每個部分,按照引擎讀取它的順序:錨點、字元類別、量詞、群組、查找和轉義,所有這些都標記和縮進,因此嵌套結構可見。這 正規表示式解釋器 使用真實的 JavaScript 引擎驗證模式,並在瀏覽器中進行整個分解,不上傳任何內容。

什麼是正規表示式解釋器?

正規表示式解釋器採用正規表示式並將其(一次一個構造)轉換為您可以閱讀的描述。而不是盯著看 ^(?<user>[a-z0-9._%+-]+)@ 重建它在你頭腦中的含義,你會得到一個有序列表:這是一個字串開始錨點,這是一個名為用戶的命名捕獲組,這是一個與小寫字母、數字、點、一個字元類別相符的字元類別。百分號、加號或連字符,這個量詞意味著一次或多次。模式沒有改變,但理解它的努力已經從你的頭腦轉移到了工具上。

這個值來自於正規表示式故意緊湊的事實。每個符號都帶有意義,相同的意圖可以用多種不同的方式書寫,因此沒有可靠的方法可以像瀏覽函數一樣瀏覽模式。單一雜散反斜線將文字點變更為 &quot;任何字元、&quot;貪婪量詞,您想要一個懶惰的量詞,它會更改群組捕獲的文字。正確閱讀正規表示式意味著模擬發動機,而手動模擬發動機速度緩慢且容易出錯。解釋器進行模擬並向您顯示結果。

在 toolz。dev 上,流程很短。您貼上沒有周圍斜線的模式,切換它使用的標誌,然後立即出現故障。嵌套組是縮排的,因此圖案的形狀一目了然,並且每個標誌都在上下文中描述,以便您了解它如何更改整個匹配而不僅僅是語法。

解釋器與正規表示式測試器有何不同?

這兩個工具回答不同的問題,知道您需要什麼可以節省時間。正規表示式測試儀根據範例文字運行模式並顯示其匹配的內容:突出顯示的匹配、捕獲組和任何錯誤。它回答並引用;這個模式是否能滿足我對此輸入的要求。&引用;解釋器描述了模式的含義,而根本沒有任何測試輸入。它回答並引用;這個模式實際上在說什麼。&引用;

當正規表示式是未知數而不是資料時,您會聯絡解釋器。查看新增驗證模式的拉取請求、繼承充滿未記錄表達的程式碼庫或嘗試理解從論壇複製的答案,這些都是您擁有該模式並且在信任它之前需要知道它做了什麼的情況。你伸手去拿 正規表示式測試儀 當您已經了解該模式並想要根據真實範例確認其行為時。在實踐中,兩者成對工作:解釋一個模式以理解它,然後測試它以證明它。正是因為這個原因,測試員和解釋器在 toolz。dev 上坐在一起。

家族中還有第三個工具值得命名。這 正規表示式建構器 當您從頭開始時,從元件和模板組裝模式。建構、解釋、測試:這三者涵蓋了使用正規表示式的整個生命週期,從編寫尚未編寫的表達式到理解未編寫的表達式。

細分實際上顯示了什麼?

解釋器從左到右遍歷模式,並按照引擎遇到它們的順序為每個構造發出一條標記線。這種排序很重要,因為正規表示式是按順序讀取的,並且按順序查看令牌反映了匹配的實際進行方式。

在大多數模式中,錨都是第一位的。這 ^$ 符號與字元不符;當設定多行標誌時,它們斷言一個位置、字串的開始和結束,或每行的開始和結束。解釋者注意到了這種雙重行為,因此您永遠不會對錨點在下面表現不同感到驚訝 m 旗幟。

字元類別寫在方括號中,描述從集合中提取的單一字元。解釋者將集合擴展為單字:範圍類似 a-z 成為&引用;範圍a到z,&引用;速記逃脫就像 \d 成為&quot;數字,&quot;領先的插入符變成 &quot;任何不是&quot的字元;列出的集合。密集的類別喜歡 [a-zA-Z0-9._%+-] 讀起來是一個簡單的列表,而不是一個謎題。

量詞是微妙錯誤所在的地方,因此它們有自己的台詞。 A * 為零或更大, + 是一項或多項, ? 是零或一,且 {n,m} 是一個顯式範圍。至關重要的是,解釋者標記了惰性量詞,即用尾隨寫成的量詞 ? 例如 +? 或者 *?,因為貪婪和懶惰之間的差異會改變模式捕獲的文本,而不會改變其他地方的單一可見字元。

群組和環顧四周會縮排以顯示築巢。捕獲組、非捕獲組、命名組和所有四種環顧類型都會獲得它們所做的事情的描述,並且它們內部的兒童圖案縮進一級,因此結構讀起來就像一個嵌套的輪廓,而不是一系列平坦的符號。

以下是常見結構如何映射到解釋器告訴您的內容:

構造 例子 解釋者怎麼說
^ 字串的開始(或帶有 m 標誌的行的開始)
人物類別 [a-z] 從 a 到 z 範圍的單一字元
速記 \d 數字,0 到 9
量詞 {2,} 重複2次或以上
惰性量詞 +? 重複一次或多次,盡可能少
捕獲組 (...) 捕獲組的開始,儲存以供重複使用
命名組 (?<id>...) 命名捕獲組的開始&quot;id&quot;
展望 (?=...) 封閉的圖案必須遵循,但不能被消耗
反向引用 \1 與捕獲的相同文字組 1 匹配

這些描述遵循中使用的術語 MDN 正規表示式參考,因此,如果您想進一步閱讀任何單一結構,細分中的單字就是要搜尋的單字。

為什麼味道很重要?

正規表示式不是一種語言;它們是一系列密切相關的。 JavaScript、PCRE(PHP 和許多工具使用)、Python&#39;s re module、java 和。NET 都共享核心語法,但它們在邊緣上有所不同,而這些邊緣是混亂滋生的地方。 Regex 解釋器描述了 JavaScript 正規表示式、瀏覽器和 Node。js 使用的風格,因為這就是該工具所驗證的內容以及大多數 Web 開發人員實際運行的內容。

共享核心大而可靠。字元類別、常用量詞、交替 |、分組、錨點和標準簡寫,例如 \d\w 到處都是同樣的意思。如果您的模式僅使用這些,則無論您最終使用哪種語言,解釋都是準確的。分歧在於高級功能:javascript 中較晚出現的向後看支持,與PCRE 不同,命名組語法因風格而異,並且某些引擎支援JavaScript 根本沒有遞歸或所有格量詞。

實用規則很簡單。將共享結構的解釋視為權威,並根據目標語言的文檔仔細檢查任何特定於風味的擴展。因為解釋器首先使用真實的 JavaScript 引擎驗證模式,因此 JavaScript 不支援的構造將顯示為錯誤而不是錯誤的解釋,這是更安全的故障。如果您像我一樣在堆疊中工作,在 PHP 後端和 JavaScript 前端之間移動,明確風味可以節省在一個地方工作的模式在另一個地方默默地行為不端的錯誤類別。

如何用它閱讀真實的模式?

預設情況下,以電子郵件形狀的圖案為工具載入範例: ^(?<user>[a-z0-9._%+-]+)@(?<domain>[a-z0-9.-]+\.[a-z]{2,})$ 帶上不區分大小寫的標誌。它本身就是一張嘴。將其運行通過解釋器,然後分解為簡短的、可讀的輪廓。

^ 斷言字串的開頭。第一個命名的群組(使用者)從地址本地部分通常允許的一類小寫字母、數字和標點符號中捕獲一個或多個字元。然後是文字 @. 第二個命名的群組、網域捕獲一個或多個字母、數字、點或連字符,後面跟著一個文字點和一系列兩個或多個字母,這是頂級網域。最後 $ 斷言字串的結尾。這 i 標誌意味著無論情況如何,整個事物都匹配,因此僅小寫的類別仍然接受大寫的輸入。

這樣讀,有兩件事跳出來,在原始模式中是看不見的。首先, {2,} 在頂級域名上,表示該模式接受任何兩個或多個字母的 TLD,這對於現代域來說是正確的,但會拒絕用非拉丁字符書寫的國際化 TLD。其次,錨點意味著模式必須與整個字串匹配,因此它驗證了整個地址,而不是在更大的文本中找到一個地址。這些正是決定驗證正規表示式是否過於嚴格或過於寬鬆的細節類型,它們在細分中很明顯,而在原始版本中很容易錯過。

一旦你了解了一種模式,你通常就會想用它做點什麼。如果它是查找和替換模式,則 正規表示式替換 工具運行帶有反向引用支援的替換。如果是提取模式,則 電子郵件提取器 將此類電子郵件的精選版本應用於批量文字。解釋器是閱讀步驟;這些是行動步驟。

我什麼時候才能真正使用它?

程式碼審查是我最常遇到的情況。隊友在驗證層或對數解析器中加入正規表示式,差異顯示一行沒有註解的符號。將其貼到解釋器中,將五分鐘的凝視變成十秒的閱讀,它會捕捉到經典的評論未命中:與任何字元匹配的未轉義的點、捕獲過多的貪婪量詞、存在或存在的錨點否則應該是另一種方式。我已開始將細分貼到拉取請求中作為評論,免費記錄下一個人的模式。

學習是下一個。正規表示式是一種永遠不會完全堅持的技能,除非你每天都使用它們,幾個月後回到它們總是意味著重新學習語法。與解釋器一起閱讀真實模式比重讀教程更快,因為你在上下文中看到結構,做實際的工作,而不是作為孤立的例子。隨著時間的推移,這些描述變得不必要,因為你已經將它們內化了,這就是重點。

調試結束循環。當一個模式與錯誤的事情匹配時,解釋通常會在您到達測試輸入之前揭示原因。一個貪婪的量詞,它應該懶惰,一個包含您忘記的角色的角色類別,一個丟失的錨,讓該模式與子字串匹配:所有這些在細分中都可見。我把解釋器放在旁邊 正規表示式測試儀 所以我可以在同一次會議上進行解釋和測試,並且兩者都住在我在其中描述的更寬的套件中 web 開發人員工具包指南.

它是私人的,並且離線工作嗎?

兩者都是肯定的,並且出於同樣的原因。整個故障是在瀏覽器內的 JavaScript 中計算的。該模式永遠不會發送到伺服器,不會記錄任何內容,一旦頁面加載,工具就會繼續工作,但會停用您的連線。您可以透過開啟網路標籤或離線並觀看其繼續運作來確認這一點。

這比正規表示式所看起來更重要。模式通常是為了匹配敏感格式而編寫的:內部識別碼、API 金鑰形狀、帳號佈局或私有資料的結構。將其中一個貼上到伺服器端工具中意味著將資料格式的描述交給第三方。保留分析客戶端意味著該模式保留在您的電腦上,這與 toolz。dev 上每個工具背後的隱私優先原則相同,我在其中更全面地寫到了這一點 資料隱私指南.

問號

我如何理解複雜的正規表示式?

將模式貼到解釋器中並閱讀逐個令牌的分解,它按照引擎應用它的順序用簡單的英語描述每個構造。嵌套組被縮進,以便您可以看到結構。這會在心裡模擬引擎,只需讀取一個標記的列表,這樣速度更快,而且錯誤的可能性也小得多。

正規表示式解釋器和正規表示式測試器有什麼不同?

正規表示式解釋器描述模式在沒有任何測試輸入的情況下意味著什麼,而正規表示式測試器則根據範例文字運行模式並顯示其匹配的內容。使用解釋器來理解或記錄不熟悉的模式,然後使用測試器來確認其行為符合真實資料的預期。他們回答不同的問題並像一對一樣工作得很好。

解說器描述了什麼樣的正規表示式?

它描述了 JavaScript (ECMAScript) 正規表示式,即瀏覽器和 Node。js 使用的風格。大多數語法,包括字元類別、量詞、群組和錨點,都與 PCRE、Python 和 Java 共享,因此核心解釋在跨語言中是準確的。特定於風味的功能(例如向後看和命名群組語法)可能會有所不同,因此請根據目標語言驗證這些功能。

貪婪和懶惰量詞有什麼區別?

貪婪量詞(例如 + 或 *)在回溯之前匹配盡可能多的文本,而懶惰量詞(相同的符號後面跟著 ?)例如+?或*?,匹配盡可能少。解釋器明確地標記懶惰量詞,因為差異會改變模式捕獲的文本,而不會改變其他地方的任何可見字元。

解釋者可以看向前方並回顧嗎?

是的。正面和負面的前瞻,書面(?=...)和(?!...),正面和負面的後瞻,書面(?&lt;=...)和(?&lt;!...),每個都標有它們所斷言的內容,並且像其他組一樣縮排。 Lookarounds 檢查文字是否出現在未將其包含在匹配中的位置,並且描述明確了這一點。

為什麼解釋者說我的模式無效?

在解釋之前,使用真實的 RegExp 引擎編譯模式,因此使用引擎報告不平衡括號或括號、無效轉義或未知標誌&#39;s 確切的錯誤訊息。修復報告的問題,最常見的是缺少結束括號或括號,並且會出現故障。

貼上與私有資料相符的正規表示式是否安全?

是的。該模式完全在瀏覽器內的 JavaScript 中進行分析。它永遠不會發送到伺服器,永遠不會記錄,並且一旦頁面加載,該工具就會在您的連接被停用的情況下工作。您可以安全地解釋私人程式碼庫或與個人或專有格式相符的模式。

這與正規表示式建構器有何不同?

當您從頭開始時,正規表示式建構器可協助您從元件和範本建立新模式,而解釋器則描述您已有的模式。兩者是互補的:使用正規表示式建構器建立模式,使用解釋器理解現有模式,並根據正規表示式測試儀的真實輸入進行確認。


免費閱讀您自己的圖案 正規表示式解釋器. 它完全在您的瀏覽器中,以簡單的英語逐個令牌地分解正規表示式,不上傳任何內容。

Comments

0 comments

0/2000 characters

No comments yet. Be the first to share your thoughts!