讓我建造這個的任務很無聊,這正是它值得自動化的原因。一位客戶遞給我一份 4,000 行的匯出表,其中每個日期都寫成美式風格 01/15/2024,以及它要進入的系統需要 ISO, 2024-01-15。 簡單的查找和替換無法觸及它,因為沒有固定的字串可供搜尋 - 日期都不同。他們分享的是a 形狀:兩位數字,一個斜線,兩個數字,一個斜線,四位數字。這正是正規表示式匹配的東西,也正是正規表示式替換一次重寫的東西。我將檔案貼到暫存工具中,編寫一個表達式,整個匯出在一秒鐘內翻轉格式。
這就是免費的工作 正規表示式替換 工具可以,本指南是如何很好地使用它的一長版本。我將介紹正規表示式替換的實際內容、捕獲群組反向引用如何讓您重組文字而不是僅刪除它、每個特殊替換令牌的含義以及導致人們絆倒的錯誤。它坐在旁邊 正規表示式測試儀 我單獨寫了 - 測試人員告訴您模式匹配的內容,並且該工具重寫它匹配的內容。如果正規表示式本身對您來說是新的,請從 開始 完整的編碼工具指南 然後回來。
TL;DR: 正規表示式替換按模式匹配文本,並使用替換字串重寫每個匹配。將要重複使用的部分包裝在括號中以建立編號組,然後在替換中引用它們
$1,$2,等等--模式(\d{4})-(\d{2})-(\d{2})換人$3/$2/$1轉彎2024-01-15進入15/01/2024. 開啟g標誌要替換每個匹配項,將替換項留空以刪除匹配項,然後使用$<name>對於命名組。這 正規表示式替換 該工具完全在您的瀏覽器中運行,並即時顯示替換計數。
什麼是正規表示式替代品?
普通的查找和替換適用於文字:您輸入要查找的確切單字以及要放置在其位置的確切單字。當您想要更改的內容不是固定字串而是模式時,它就會失敗 - 一百種形式的日期、電話號碼、HTML 標籤、尾隨空格運行、遵循約定的變數名稱。正規表示式描述該模式,正規表示式替換將其與表示如何重寫每個匹配項的範本配對。
該機構有兩半。這 圖案 是引擎掃描文字的正規表示式,找到形狀出現的每個位置。這 更換 是一個替換每個匹配項的字串。在最簡單的情況下,替換是純文本,並且每個匹配都變成相同的東西 - 對於將每次運行的製表符和空格標準化為單一空格很有用。強大的情況是當替換引用匹配的部分內容時,因此輸出是根據輸入構建的,而不是固定的常數。這就是將正規表示式替換從生硬的刪除和重排轉變為真正的重組工具的原因。
在引擎蓋下, 正規表示式替換 工具使用 JavaScript RegExp 發動機和 String.prototype.replace 每個瀏覽器和 Node。js 都附帶的方法。這很重要,原因很實際:您在工具中看到的行為與將相同的模式和替換貼上到自己的 JavaScript 或 TypeScript 程式碼中時得到的行為相同。當您從從頭開始工具轉向生產時,沒有單獨的味道需要學習,也不奇怪。工具接受的替換語法 - $1, $&, $<name> 其餘的 - 是標準定義的精確語法,記錄在案 MDN's String.replace 參考.
捕獲組反向引用如何運作?
這是正規表示式替換中最有用的想法,值得放慢速度。當您將部分模式放入括號內時,您會建立一個 捕獲組. 引擎記住該組匹配的文本,並從左到右從 1 開始對組進行編號。在替換字串中, $1 意思是&引用;插入第一組捕獲的任何內容,&引用; $2 第二個,依此類推 $99.
日期範例使其具體。圖案 (\d{4})-(\d{2})-(\d{2}) 分為三組:四位數字年、兩位數字月、兩位數字日。當它匹配時 2024-01-15第一組持有 2024第二組成立 01,第三組成立 15. 的替代品 $3/$2/$1 然後以不同的順序和不同的分隔符號從這些片段中組裝一條新繩子,產生 15/01/2024. 沒有刪除和重新輸入任何內容 - 輸出實際上是從捕獲的片段重建的。重新排序令牌,更改它們之間的標點符號,將它們包裝在其他文字中,然後您已使用一個表達式重新格式化文件中的每個日期。
命名組與可讀標籤的想法相同。你寫不是計算括號 (?<year>\d{4}) 並在替換中將其稱為 $<year>。 對於具有兩組或三組的模式,數字很好,但一旦您雜耍五組或六組,名稱就會使模式和替換內容更容易閱讀和稍後更改。該工具可以互換地支援兩者,因此您可以混合使用 $1 和 $<name> 如果您願意,可以在同一個替換中。當您第一次組裝模式時,尚不確定您需要哪些群組 正規表示式建構器 在將其帶到這裡運行替換之前,幫助您逐塊構建它。
特殊替換代幣是什麼意思?
美元符號在替換字串中很特殊,它引入了編號和命名組之外的一小組代幣。了解它們可以讓您免於獲得比您需要的更複雜的模式。
$& 插入整個匹配的子字串。當你包裝或註釋匹配而不是重建它們時,這就是你想要的 - 一種模式 \b\w+@\w+\.\w+\b 用替換 <$&> 在每個電子郵件地址周圍放置尖括號,而無需將整個內容捕獲在群組中。 $\`` (a backtick) inserts everything *before* the match, and $'(an apostrophe) inserts everything *after* it; these are rarely needed but occasionally exactly right. And because$is special, outputting a literal dollar sign requires doubling it:$$in the replacement produces a single$` in the output, which mainst the day you are reformating cenrice。
有一個刪除習慣用語值得記住:空替換會刪除每個匹配項。當全域標誌開啟且「替換」欄位留空時,該工具會從文字中刪除每次出現的模式。這是剝離某些內容的最乾淨的方法 - 所有 HTML 標籤 <[^>]+>,每個尾隨空間 +$ 在多行模式下,電話號碼中的所有非數字 \D. 您不會用空格或佔位符替換;你什麼都沒有替換,匹配就消失了。
哪些標誌對於更換很重要?
正規表示式上的標誌改變了它的應用方式,其中兩個在日常更換工作中佔據主導地位。其餘的都是情境性的,但偶爾也是決定性的。
全球旗幟, g,是您切換最多的。沒有它,javascript's replace 僅更改 第一的 匹配並保留文字的其餘部分 - 這是標準 String.replace 行為讓那些期待更換的人感到驚訝。轉 g 文字中的每個匹配項都被重寫。該工具預設為全域打開,因為替換所有內容是人們二十次中的十九次的意思,但是切換適用於您真正想僅觸及第一次出現的次數。忽略案例標誌, i,無論字母大小寫如何,都使模式匹配,因此 error 也匹配 Error 和 ERROR - 當您標準化日誌等級或整理不一致的資本時,這一點至關重要。
多行標誌, m,改變錨點 ^ 和 $ 意思是:打開後,它們匹配每個的開始和結束 線 而不是整個文本,這是您在剝離尾隨空白或為每行前綴時想要的。點全部標誌, s,讓點匹配換行符,這樣模式就可以跨越換行符 - 對於重寫多行區塊很有用。這 u (unicode)和 y (黏性)標誌適用於高級情況: u 能夠正確處理基本平面和某些轉義形式之外的字符,並且 y 將每場比賽的嘗試錨定在前一場比賽之後的確切位置。下面的比較表總結了每個人何時獲得自己的位置。
| 旗幟 | 信 | 對更換的影響 | 典型用途 |
|---|---|---|---|
| 全球 | g |
更換所有匹配項,而不僅僅是第一個匹配項 | 幾乎每一個都替換了 |
| 忽略案例 | i |
無論字母大小寫如何,都匹配 | 標準化日誌水平,整理資本 |
| 多行 | m |
^ 和 $ 錨定到每條線 |
前綴線,剝離尾隨空間 |
| 點全部 | s |
該點也與換行符相符 | 重寫多行塊 |
| 統一碼 | u |
正確處理星體特徵和 \u{...} |
表情符號,非拉丁文字 |
| 黏的 | y |
僅在當前位置匹配 | 令牌器,嚴格的順序解析 |
我什麼時候應該使用正規表示式替換而不是簡單的查找和替換?
分界線很簡單:當您知道確切的文字時,使用簡單的查找和替換,當您知道形狀但不知道確切的文字時,使用正規表示式替換。如果您要更改每個 2023 到 2024(、普通的替換)更快、更安全。如果您每四位數更換一次,無論值如何,只有一種模式才能表達這一點。
三個任務系列顯然屬於正規表示式一方。第一個是 重新格式化,內容保持不變,但其排列發生變化 - 日期、電話號碼、寫好的姓名和報價;最後,第一和報價;您想要的"第一個最後。"捕獲組加上重新排序的替換處理所有這些。第二個是 批量剝離,您可以透過不替換任何內容來刪除與模式相符的所有內容 - 標籤、註釋、控製字元、額外的空白。第三個是 規模條件編輯,在包裝、前綴或註釋圖案每次出現的地方,使用 $& 保持匹配並添加。當您向自己描述的轉換包含單字 "每個"後面跟著描述而不是文字字串,您就處於正規表示式替換區域。
還有一個工作流程參數。在程式碼編輯器中執行這些編輯'尋找並替換有效,但它會編輯到位的文件,這意味著錯誤就是真實文件中的錯誤。首先在暫存工具中執行轉換,讓您在提交任何內容之前看到輸出和替換計數,然後將驗證的結果貼回。因為 正規表示式替換 該工具完全在您的瀏覽器中運行,從不上傳您貼上的內容,即使文字是生產日誌或客戶匯出,它也可以安全使用 - 我在其中完整地指出了這一點 線上工具的資料隱私指南.
regex 替換的常見錯誤是什麼?
最常見的是忘記全域標誌並想知道為什麼只有第一個匹配項發生了變化。如果您的替代者似乎幾乎沒有採取任何行動 - 在您期望數十次的地方進行編輯 - 請檢查一下 g 正在。這是一次非常常見的旅行,工具預設將其打開,但當您將其關閉以瞄準單一匹配項時,請記住將其返回。
第二個是字面意思 $1 出現在您期望捕獲的文字的輸出中。這幾乎總是意味著您引用的群組不存在 - 您的模式沒有第一組括號,因此沒有任何內容 $1 代替,引擎保持令牌原樣。修復方法是將您想要重複使用的部分包裝在括號中以建立群組,並從左側開始計算群組。當您的模式有嵌套或可選群組時,相關的陷阱是計數錯誤;當編號變得混亂時,切換到命名群組,以便引用是明確的。
第三個錯誤是一種比您想要的更匹配的模式,通常是因為量詞是貪婪的。類似的模式 <.+> 旨在匹配一個 HTML 標籤將從第一個標籤開始愉快地匹配 < 到 最後的 > 在線上,吞下兩個標籤之間的一切。治癒是一個非貪婪的量詞, <.+?>,或者更精確的字元類, <[^>]+>. 這正是你驗證模式的情況 正規表示式測試儀 首先,觀察它突出顯示的內容,然後才運行替換 - 一個習慣 正規表示式測試儀指南 詳細瀏覽。工具中顯示的替換計數是您的另一個保障措施:如果它報告的替換數量遠多於或遠少於您要更改的內容數量,則模式是錯誤的,而不是工具。
一個可行的例子:重新格式化名稱和消除噪音
讓我從頭到尾完成一項小工作,因為看到這些部分一起工作比任何單一規則都更好地修復了這個想法。假設您有一個匯出為 的聯絡人清單 Doe, Jane 和 Smith, John,每行一個,您希望它們為 Jane Doe 和 John Smith.
每行的形狀是:一些單字字元、一個逗號、一個空格,然後是更多的單字字元。作為一種模式 (\w+), (\w+),姓氏在第一組中捕獲,名字在第二組中捕獲。交換它們並刪除逗號的替換是 $2 $1 - 第二組,一個空格,第一組。將清單貼到 正規表示式替換 工具,輸入該模式並替換,保留全域標誌,每行翻轉到 "第一個最後&引用;一次。替換計數告訴您觸摸了多少行,您可以根據聯絡人數量進行理智檢查。
現在假設相同的匯出在某些行上有尾隨空格,您也希望刪除這些空格。這是第二個單獨的替換:模式 +$ 多行標誌就這樣 $ 匹配每行的末尾,並進行空替換,以便刪除而不是替換匹配的空格。在名稱交換且檔案乾淨後運行它。兩遍方法 - 一個替換用於重組,一個替換用於剝離 - 是典型的,因為每次通過都會向您顯示其輸出並在將其複製出來之前進行計數,因此您永遠不會猜測轉換是否達到了您的含義。當重塑的文字需要與原始文字的最終視覺差異以確認沒有其他移動時,請將兩個版本貼上到 文字差異 工具。對於更廣泛的日常實用工具包,這適合 web 開發人員工具包 收集我最能接觸到的人。
常見問題
如何在網路上找到並替換正規表示式? 在「尋找」欄位中輸入模式,不帶斜線,在「替換」欄位中寫入替換,選擇標誌,然後貼上文字。重寫的輸出會立即出現並顯示有多少替換已運行。一切都會發生在您的瀏覽器中,因此不會上傳任何內容。
捕獲組反向引用在替換中如何運作?
模式中的括號建立編號組,然後在替換時重複使用它們,分別為 $1、$2 等。例如,模式 (\d{4})-(\d{2})-(\d{2}) 替換後的 $3/$2/$1 將 2024-01-15 變成 15/01/2024。命名組如(?
如何替換所有匹配項而不僅僅是第一個匹配項? 啟用 g(全域)標誌。如果沒有它,JavaScript 只會替換第一個匹配項,就像 String。replace 方法的行為一樣。啟用 g 後,文字中的每個匹配項都會被替換,這就是大多數替換所有任務所需要的。
如何刪除每個匹配項而不是替換它? 將替換欄位留空。當全域標誌開啟時,每個匹配都會從文字中刪除。這是剝離標籤、空白運行或共享模式的不需要的字元的最乾淨方法。
特殊代幣 $& 是什麼意思?、反引號和撇號在替換中意味著什麼? $&插入整個匹配的子字串,反向勾號在匹配之前插入文本,撇號在匹配之後插入文本。要輸出文字美元符號,請寫 $$。這些遵循標準 JavaScript String。替換特殊的替換模式。
該工具使用什麼正規表示式風味? 它使用瀏覽器內建的 JavaScript (ECMAScript) RegExp 引擎,該引擎與 Node。js 中的引擎相同。此處的結果與 JavaScript 和 TypeScript 中相同模式和替換的行為方式相符。 JavaScript regex 在某些進階功能上與 PCRE、Python re 和 Java 不同。
為什麼我的替代者會產生文字 1 美元而不是捕獲的文字? 輸出中字面上的 $1 通常意味著您的模式沒有第一個捕獲組,因此 $1 沒有什麼可引用的。將要重複使用的部分包裝在括號中以建立群組,並從 1 開始從左到右計數群組。
在敏感資料上執行正規表示式替換是否安全? 是的。所有匹配和替換都發生在瀏覽器內的 JavaScript 中,因此不會將模式、替換或文字傳送到任何伺服器,不會記錄任何內容,並且該工具可以在停用您的連線的情況下運作。您可以安全地重新格式化日誌檔案、個人資料或專有格式。
本指南附贈免費 正規表示式替換 toolz。dev 上的工具 - 無需註冊、無需上傳、離線工作。



