有一次我在一個貪婪的量詞中失去了大部分下午的時間。我正在為 WordPress 遷移編寫一個重定向地圖 - 幾百個舊 URL 需要重寫為新的 slug - 我有一個正規表示式 假定的 捕捉每條路徑的尾隨蛞蝓。它適用於我在腦海中測試的三個 URL。它不適用於第四個,它有兩個路徑段,因為 .* 愉快地吞下了第一個斜線以及之後的一切。規則默默地將一半的網站重定向到錯誤的地方,我從讀者那裡發現了,而不是從我的測試中,因為我的"測試&引用;盯著模式並相信它。
這就是正規表示式的核心問題:它們只是寫,直到你將它們與某些東西運行。直到真實輸入證明錯誤為止,模式讀起來才合理,並且故障模式很安靜。與任何內容不匹配的正規表示式不會產生錯誤。匹配太多而不會產生錯誤的正規表示式。具有巧妙錯誤的捕獲組的正規表示式會將錯誤的子字串交給您並繼續前進。了解模式的唯一方法就是向它提供它實際看到的混亂的、充滿邊緣情況的文字 看 抓住它所抓住的東西。
一個 正規表示式測試儀 縮小這個差距。你把你的模式放在一個盒子裡,你的樣本文本放在另一個盒子裡,每場比賽都會亮起--捕獲組被打破,這樣你就可以準確地看到字串的哪一部分落在第1 組和第2 組。為 toolz。dev 構建,在瀏覽器上運行's 原生 RegExp 引擎與 JavaScript 和 TypeScript 程式碼使用的引擎相同,因此您在測試儀中看到的是您在生產中獲得的引擎。沒有近似值,沒有"夠接近。&引用;
本指南介紹如何使用測試器快速調試模式、每個標誌的實際功能、捕獲群組和命名群組如何在輸出中顯示,以及觸發來自 Python 或 PCRE 的人員的 JavaScript 特定陷阱。
TL;DR: 將您的圖案貼到 toolz。dev 正規表示式測試儀 (無需斜線),切換 g/i/m/s/u/y 標誌,然後刪除下面的測試文字。匹配以交替的顏色反白顯示即時,每個匹配列出每個編號和命名的捕獲組,語法錯誤顯示引擎'確切的訊息。它使用真正的 JavaScript RegExp 引擎,運行 100% 客戶端,因此敏感日誌永遠不會上傳,並與 正規表示式建構器 用於從頭開始組裝圖案。
如何在不執行整個程式的情況下測試正規表示式?
調試正規表示式的緩慢方法是我們大多數人開始的循環:編輯程式碼中的模式、運行程式、讀取輸出、猜測出了什麼問題、重複。每次迭代都需要整個程式運行,並且回饋是間接的 - 您會看到 後果 比賽的,不是比賽本身。
測試人員將循環折疊為無。您貼上模式,貼上代表性文本,然後立即查看匹配項。當您更改模式中的一個字元時,高光會更新。這會將回饋收緊到可以的程度 探索- 嘗試a + 你在哪裡有一個 *,添加一個單字邊界,使一個群組不被捕獲 - 並即時觀看效果著陸而不是想像它。
關鍵學科正在使用 真正的 測試文本,而不是你腦海中乾淨的例子。破壞我的重定向地圖的 URL 有兩個路徑段;我的心理測試案例有一個。如果我把舊 URL 的實際清單貼到測試器中,那麼第四行的貪婪匹配就會明顯錯誤。抓取實際的日誌行、實際的使用者輸入、實際的檔案路徑(包括醜陋的檔案路徑),然後讓測試器在使用者之前向您顯示模式崩潰的位置。
正規表示式標誌實際上會改變什麼?
標誌改變了整個圖案的應用方式,而誤解它們是大部分"為什麼不't這部作品"時刻。這 測試員 將所有六個 JavaScript 標誌作為切換公開,以便您可以翻轉一個並觀看結果移動。
g--全球。 如果沒有它,匹配會在第一次點擊時停止。有了它,引擎就會找到文字中的每個匹配項。在測試器中,全域預設為開啟狀態,因為您幾乎總是想看到所有匹配項;關閉它以確認單場比賽的呼叫是什麼樣的 String.match 沒有 g 會回來的。
我--忽略案例。 使整個模式不區分大小寫,所以 error 比賽 Error 和 ERROR. 直截了當,g之後最常用的標誌。
m-多行。 這一點被廣泛誤解。確實如此 不是 使 . 交叉線斷裂。它改變了什麼 ^ 和 $ 錨定至:與 m,他們在每個比賽的開始和結束時都匹配 線,不僅僅是整個字串的開頭和結尾。如果您'在日誌中逐行匹配,您想要這個。
s - 點全部。 這就是製作的旗幟 . 匹配換行符。沒有它, . 匹配任何字元 除了 換行符,這就是為什麼要跨越多條線的模式通常會悄悄地停在第一條線。如果您的比賽應該跨越線邊界, s 這就是你所需要的--不是 m.
你- 統一碼. 啟用完整的 Unicode 模式,這使得 \u{...} 逃避工作,將代理對視為單一代碼點,並製作類似的角色類別 \p{Letter} 可用的。當您的文字有表情符號或非拉丁文字時,這一點很重要。
y--黏。 將每場比賽的錨點固定在準確的位置 lastIndex,因此匹配只有精確地從那裡開始才能成功。 It'是標記器和解析器中使用的利基標誌;大多數日常工作從不涉及它。
造成最多時間的混亂是 m 與 s。 當人們指的是 dotAll 時,他們會伸手去拿 multiline。如果你的點是't 交叉線,你需要 s. 如果您的錨是#39;t 擊中線邊界,您需要 m. 它們解決不同的問題並且經常一起使用。
捕獲組在輸出中如何顯示?
模式中的括號執行兩項工作:它們將子模式分組以進行量詞或交替,並且它們 捕捉 用於提取的匹配切片。當你'使用正規表示式從文字中提取資料 - 日期'年月,日誌行'時間戳記和關卡 - 捕獲組是整個點,錯誤它們是 " 最常見的來源;模式匹配,但我得到了錯誤的字串。"
的 測試員 列出每個匹配項及其在其下方破解的捕獲組。第 1 組是第一個括號內的子模式,第 2 組是第二個,依此類推,每個子模式都顯示有為該匹配捕獲的確切文字。這使得群組邊界錯誤變得顯而易見:如果第 1 組抓取的內容超出您的預期,您可以看到它並拉入括號。
命名組得到相同的待遇。當你寫作時 (?<year>\d{4})-(?<month>\d{2})(),測試人員以名稱 - 顯示捕獲 <year> 和 <month>- 除了編號的對應項之外,因此您可以在依賴之前確認名稱映射到您想要的切片 match.groups.year 在代碼中。命名組使模式能夠自我記錄,程式碼更具可讀性,並且看到它們在測試器中正確解析是信任它們的最快方法。
測試人員浮出水面的一個相關陷阱:參與模式但未匹配的群組 #39;t 在給定嘗試中匹配顯示為 "no match"而不是空字串。這種區別很重要,因為在 JavaScript 中這樣一個群組是 undefined,以及假設它的程式碼'總是會拋出一個字串。看到測試器中標記它,告訴您要保護該存取權限。
這是哪種正規表示式口味,為什麼它很重要?
正規表示式不是一種語言。適用於 Python' 的模式;s re 模組在 JavaScript 中可以表現不同,也可以拋出不同,反之亦然。這 測試員 使用 JavaScript (ECMAScript) 瀏覽器內建引擎,與 Node。js 運行的引擎逐位元組相同。因此,如果您'正在編寫 JavaScript、TypeScript 或 Node 程式碼,這裡的結果正是您的程式碼將要執行的內容。
這種精確度是雙向的。如果您從為 PCRE(PHP 和)編寫的堆疊溢位答案複製模式 preg_ 我在 WordPress 工作中經常使用的函數)或 Python,一些功能贏得了 't 翻譯。 JavaScript 歷史上缺乏向後看的斷言,是最近才獲得的,並且仍然以不同的方式處理一些 Unicode 屬性轉義。來自 PCRE don' 的所有格量詞和原子組;根本不存在於 JavaScript 中。遞歸 - 用於匹配嵌套結構的 PCRE 功能 - 沒有 JavaScript 等效項。
實際結果:測試風味 you'將部署在。忠實實現一個引擎的測試儀比實現所有引擎的模糊平均值的測試儀更有用,因為 "它在測試器和報價中工作;需要表示和報價;它可以在我的程式碼中工作。"對於 PHP 和 WordPress 工作,我會牢記差異並分別驗證伺服器端;對於任何 JavaScript,這個測試器 是 真相的來源。這種語言感知驗證的更廣泛工具包包含在 編碼工具指南.
正規表示式測試儀的日常用途是什麼?
建立和調試驗證模式
電子郵件欄位、電話號碼、郵遞區號、段塞、語意版本字串 - 每種形式都會驗證某些內容,驗證通常是正規表示式。測試人員可讓您在發貨前將尷尬的情況拋向您的模式:帶有加號地址標籤的電子郵件、帶有副檔名的電話號碼、版本字串等 1.10.0 那是一個天真的模式被截斷了。貼上一列真實值並觀察哪些值不匹配。
從日誌中提取資料
伺服器日誌、應用程式日誌和 CSV 匯出是半結構化文本,正規表示式是您從中提取欄位的方式。擷取群組取得時間戳記、等級、請求 ID。測試儀'每匹配組細分正是您在此處需要的視圖 - 貼上十幾個真實的日誌行,並確認每個欄位都落在所有日誌行中的正確組中,而不僅僅是整齊的第一行。這與 API調試工作流程 響應體和標頭被抓取以獲得特定值。
跨程式碼庫搜尋和替換
編輯器和 IDE 支援尋找和替換正規表示式,而那裡的不良模式可能會重寫超出預期的內容。測試 匹配 在運行替換之前,在專用測試儀中,您可以看到模式在代表性樣本中選擇的內容,然後自信地運行替換。我的重定向地圖災難從根本上來說是一種查找和替換,我從未先根據實際輸入進行測試。
學習和教學正規表示式
即時突出顯示使測試人員成為真正的學習工具。一次建立一個代幣模式,並觀看比賽集隨著添加錨點、量詞和類別而縮小和增長。看 \d+ 拿一個整數,然後 \d 抓一個數字比任何散文解釋都更能理解。當你'準備好從組件組裝模式而不是調試現有的模式時, 正規表示式建構器 是配套工具。
如何避免零長度比賽陷阱?
可以匹配空字串的模式 - a*, \d*, (foo)?- 可以&引用;匹配&引用;在字元之間的每個位置,都會產生大量空匹配。樸素的匹配程式碼不會'永遠前進經過零長度匹配循環。這 測試員 透過不斷前進來防止內部這種情況,所以它永遠不會懸掛,但它會懸掛 展示 你是空火柴。
該顯示是一個功能,而不是噪音。測試人員會告訴你,你的量詞太寬鬆了。如果你是說"一位或多位數字,"你寫了 \d* 當你想要的時候 \d+。 如果需要群組,您可以將其標記為可選 ?. 看到空匹配是診斷,表示您已修復。當您的模式正確時,匹配是您關心的子字串,僅此而已。
JavaScript 正規表示式與其他口味:快速比較
| 特色 | JavaScript(此測試器) | PCRE(PHP) | 蟒蛇 re |
|---|---|---|---|
| 命名組 | (?<name>...) |
(?<name>...) 或者 (?P<name>...) |
(?P<name>...) |
| 向後看 | 支援(現代引擎) | 支持 | 支持 |
| 原子群/所有格 | 不支援 | 支持 | 有限公司 |
| 遞歸 | 不支援 | 支持 | 不支援 |
| 點與換行符標誌相符 | s (全部點) |
s (全部) |
re.DOTALL |
統一碼屬性 \p{...} |
需要 u 旗幟 |
需要 u 修飾符 |
regex 僅模組 |
| 黏性匹配 | y 旗幟 |
\G 錨 |
\G-就像via match 位置 |
表'的教訓是"regex"是一個家庭,而不是一個標準。語法重疊足以讓你跨語言複製模式,而差異正是你在難題上達到的高級功能。測試您的目標風味。對於 JavaScript 和 Node,即#39;這個測試器;這 web 開發人員工具包 涵蓋其他特定語言工具適合的位置。
針對敏感文字測試正規表示式安全嗎?
您測試正規表示式的文字通常是敏感類型:帶有 IP 位址和使用者 ID 的生產日誌行、帶有電子郵件地址的匯出、帶有內部主機名稱的設定檔。 That'正是您的資料 應該't 貼上到工具中,然後將其運送到伺服器。
的 toolz。dev 正規表示式測試儀 完全在瀏覽器中運行。模式編譯、匹配、群組提取 - 所有這些都是客戶端 JavaScript,沒有任何網路請求將您的模式或文字帶到任何地方。頁面載入後切斷連接,它繼續工作。那'是架構保證,而不是隱私權政策句子,它'集合中每個工具背後都有相同的瀏覽器優先原則,如中所述 資料隱私指南.
這意味著您可以貼上真實的日誌行 - 那些帶有實際 PII 的日誌行,形成模式'出現邊緣情況 - 並安全地調試它們。 That's 重點:只有當您提供真實輸入時,測試器才有用,而真實輸入通常正是您可以輸入的't 發送給其他人's 伺服器。
問號
如何在線測試正規表示式?
在模式欄位中輸入模式,不帶周圍的斜線,選擇標誌,並將範例文字貼到測試區域。立即匹配突出顯示並為每場比賽列出捕獲組。所有內容都在您的瀏覽器中運行 - 不會上傳任何內容。
這個測試者使用什麼樣的正規表示式?
它使用瀏覽器內建的 JavaScript (ECMAScript) RegExp 引擎,該引擎與 Node。js 中的引擎相同。結果與 JavaScript 和 TypeScript 中相同模式的行為方式相符。 JavaScript 正規表示式與 PCRE、Python' 不同;一些高級功能(例如原子組和遞歸)中的 re 模組和 Java 模式,因此請測試您將部署的風味。
正規表示式標誌 G、I、M 和 S 是什麼意思?
g(全域)標誌找到所有匹配項,而不是停在第一個。 i 標誌使匹配情況不敏感。 m(多行)標誌使 ^ 和 $ 錨點在換行符處匹配,而不僅僅是字串開始和結束。 s (dotAll) 標誌也讓點與換行符相符。 m 和 s 標誌經常被混淆 - m 改變錨點,s 改變點。
捕獲組如何在測試儀中運作?
模式中的括號建立捕獲組。測試人員會列出每個編號的群組以及它為每次匹配捕獲的文本,以便您可以驗證模式的每個部分抓住了字串的哪個部分。命名為 (?) 的群組...) 按名稱與編號組一起顯示。
為什麼我的正規表示式不匹配或拋出錯誤?
與任何內容都不匹配的模式通常具有過度特定的字元或未轉義的特殊字元,例如文字點或加號。拋出錯誤的模式有語法問題,例如不平衡的括號或括號。測試人員顯示引擎'精確的錯誤訊息,以便您可以快速找到問題。
如何跨多行匹配?
如果您需要點來跨越換行符,請啟用 s (dotAll) 標誌;如果您希望 ^ 和 $ 錨點在每行的開頭和結尾匹配,請啟用 m(多行)標誌。將兩者結合起來,單一模式可以自然地對抗多行輸入(例如日誌或 CSV 行)。
對敏感資料進行測試是安全的嗎?
是的。所有匹配都發生在瀏覽器內的 JavaScript 中 - 沒有模式或測試文字發送到任何伺服器,沒有任何記錄,並且該工具可以在停用您的連線的情況下運作。您可以安全地測試日誌檔案、個人資料或專有格式。
正規表示式測試器和正規表示式建構器有什麼不同?
正規表示式測試器針對文字執行現有模式,以便您可以驗證和調試它,而正規表示式建構器則幫助您從元件或公共範本建立模式。使用本網站上的正規表示式產生器組裝模式,然後將其帶到測試人員以根據真實樣本資料進行檢查。
正規表示式保持只寫,直到您根據真實輸入運行它們,並且故障很安靜 - 沒有匹配,匹配太多,錯誤的群組捕獲,並且沒有錯誤告訴您。測試人員將模式變成可見: 貼上你的正規表示式,給它醜陋的真實文本,並在它抓錯東西之前準確地觀察它抓到的東西。



