範例 |
正規表示式範例 |
數字範圍 |
浮點數 |
電子郵件地址 |
IP 位址 |
有效日期 |
數字日期轉文字 |
信用卡號碼 |
完整行配對 |
刪除重複行 |
程式設計 |
兩個相鄰的字詞 |
陷阱 |
災難性回溯 |
重複次數過多 |
阻斷服務 |
讓所有內容都變成可選 |
重複擷取群組 |
Unicode 和 8 位元混用 |
本網站其他內容 |
簡介 |
正規表示式快速入門 |
正規表示式教學 |
替換字串教學 |
應用程式和語言 |
正規表示式範例 |
正規表示式參考 |
替換字串參考 |
書籍評論 |
可列印 PDF |
關於本網站 |
RSS Feed 和部落格 |
通常,您會想要在文字檔中配對整行,而不是僅配對符合特定需求的行的一部分。如果您想在 文字編輯器 中的搜尋取代中刪除整行,或在 資訊檢索工具 中收集整行,這會很有用。
為了讓這個範例更簡單,我們假設我們想要配對包含「John」這個字的整行。正規表示式 John 可以很輕易地找出這些行。但是,軟體只會指出 John 為配對結果,而不是包含這個字的整行。
解決方案相當簡單。若要指定我們需要整行,我們將使用插入符號和美元符號,並開啟選項,讓它們與內嵌換行符號相符。在用於處理文字檔案的軟體中,例如EditPad Pro和PowerGREP,插入符號總會與內嵌換行符號相符。若要符合我們原始正規表示式John的匹配之前和之後的行部分,我們只需使用點和星號。務必關閉點符合換行符號的選項。
產生的正規表示式為:^.*John.*$。您可以使用相同的方法,將任何正規表示式的匹配範圍擴充至整行或完整行的區塊。在某些情況下,例如使用交替時,您需要使用括號將原始正規表示式分組在一起。
如果一行可以符合一系列需求中的任何一個,只需在正規表示式中使用交替即可。^.*\b(one|two|three)\b.*$會匹配包含「one」、「two」或「three」等字詞的完整文字行。第一個反向參照將包含該行實際包含的字詞。如果它包含多個字詞,則最後一個(最右邊的)字詞將被擷取到第一個反向參照中。這是因為星號是貪婪的。如果我們讓第一個星號變為非貪婪的,例如^.*?\b(one|two|three)\b.*$,則反向參照將包含第一個(最左邊的)字詞。
如果一行必須滿足多個需求,我們需要使用先行斷言。^(?=.*?\bone\b)(?=.*?\btwo\b)(?=.*?\bthree\b).*$ 符合包含所有字詞「one」、「two」和「three」的完整文字行。同樣地,錨點必須符合一行的開頭和結尾,而點不能符合換行符號。由於插入符號和先行斷言為零長度的事實,所有三個先行斷言都會在每一行的開頭嘗試。每個先行斷言都會符合單一行上的任何文字片段(.*?),後接其中一個字詞。所有三個都必須成功符合,整個正規表示式才會符合。請注意,您可以將任何正規表示式(無論多麼複雜)放入先行斷言中,而不是像\bword\b這樣的字詞。最後,.*$會在先行斷言確定符合需求後,讓正規表示式實際符合該行。
如果你的條件是一行文字不包含某個東西,請使用負向先行斷言。 ^((?!regexp).)*$ 符合完全不符合 regexp 的一行文字。請注意,與之前使用正向先行斷言不同,我同時重複了負向先行斷言和點。對於正向先行斷言,我們只需要找到一個可以符合它的位置。但是負向先行斷言必須在該行的每個字元位置進行測試。我們必須測試 regexp 在任何地方都失敗,而不僅僅是在某個地方。
最後,你可以合併多個正向和負向需求,如下所示: ^(?=.*?\bmust-have\b)(?=.*?\bmandatory\b)((?!avoid|illegal).)*$。在檢查多個正向需求時,正規表示式結尾處的 .* 充滿了零長度斷言,確保我們實際上符合某些東西。由於負向需求必須符合整行,因此很容易用負向測試取代 .*。
| 快速開始 | 教學 | 工具和語言 | 範例 | 參考 | 書籍評論 |
| 正規表示式範例 | 數字範圍 | 浮點數 | 電子郵件地址 | IP 位址 | 有效日期 | 數字日期轉文字 | 信用卡號碼 | 符合完整行 | 刪除重複行 | 程式設計 | 兩個相近的字 |
| 災難性回溯 | 重複次數過多 | 阻斷服務 | 讓所有東西都變成可選的 | 重複擷取群組 | 混合 Unicode 和 8 位元 |
頁面網址: https://regular-expressions.dev.org.tw/completelines.html
頁面最後更新:2019 年 11 月 22 日
網站最後更新:2024 年 3 月 15 日
版權所有 © 2003-2024 Jan Goyvaerts。保留所有權利。