快速入門
教學
工具和語言
範例
參考
書籍評論
範例
正規表示式範例
數字範圍
浮點數
電子郵件地址
IP 位址
有效日期
數字日期轉文字
信用卡號碼
完整行配對
刪除重複行
程式設計
兩個相鄰的字詞
陷阱
災難性回溯
重複次數過多
阻斷服務
讓所有內容都變成可選
重複擷取群組
Unicode 和 8 位元混用
本網站其他內容
簡介
正規表示式快速入門
正規表示式教學
替換字串教學
應用程式和語言
正規表示式範例
正規表示式參考
替換字串參考
書籍評論
可列印 PDF
關於本網站
RSS Feed 和部落格
RegexBuddy—The most comprehensive regular expression library!

整行文字配對

通常,您會想要在文字檔中配對整行,而不是僅配對符合特定需求的行的一部分。如果您想在 文字編輯器 中的搜尋取代中刪除整行,或在 資訊檢索工具 中收集整行,這會很有用。

為了讓這個範例更簡單,我們假設我們想要配對包含「John」這個字的整行。正規表示式 John 可以很輕易地找出這些行。但是,軟體只會指出 John 為配對結果,而不是包含這個字的整行。

解決方案相當簡單。若要指定我們需要整行,我們將使用插入符號和美元符號,並開啟選項,讓它們與內嵌換行符號相符。在用於處理文字檔案的軟體中,例如EditPad ProPowerGREP,插入符號總會與內嵌換行符號相符。若要符合我們原始正規表示式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).)*$。在檢查多個正向需求時,正規表示式結尾處的 .* 充滿了零長度斷言,確保我們實際上符合某些東西。由於負向需求必須符合整行,因此很容易用負向測試取代 .*