快速開始
教學
工具和語言
範例
參考
書籍評論
正規表示式教學
簡介
目錄
特殊字元
不可列印字元
正規表示式引擎內部
字元類別
字元類別減法
字元類別交集
簡寫字元類別
錨點
字詞邊界
交替
可選項目
重複
群組和擷取
反向參照
反向參照,第 2 部分
命名群組
相對反向參照
分支重設群組
自由間距和註解
Unicode
模式修改器
原子群組
獨佔量詞
前瞻和後顧
環顧,第 2 部分
將文字排除在比對之外
條件式
平衡群組
遞迴
子常式
無限遞迴
遞迴和量詞
遞迴和擷取
遞迴和反向參照
遞迴和回溯
POSIX 方括號表示式
零長度比對
持續比對
本網站的更多內容
簡介
正規表示式快速開始
正規表示式教學
替換字串教學
應用程式和語言
正規表示式範例
正規表示式參考
替換字串參考
書籍評論
可列印 PDF
關於本網站
RSS 饋送和部落格
RegexBuddy—Better than a regular expression tutorial!

字元

最基本的正規表示式包含一個單一字元,例如 a。它會比對字串中第一個出現的該字元。如果字串是 Jack is a boy,它會比對 J 後面的 a。這個 a 出現在字詞中間,對正規表示式引擎來說並不重要。如果你覺得重要,你需要使用 字詞邊界 告訴正規表示式引擎。我們稍後會討論到。

這個正規表示式也可以比對第二個 a。它只有在你告訴正規表示式引擎在第一次比對後繼續搜尋字串時才會這麼做。在文字編輯器中,你可以使用「尋找下一個」或「向前搜尋」功能。在程式語言中,通常有一個獨立的功能,你可以呼叫它在之前比對後繼續搜尋字串。

類似地,正規表示式 cat 會在 About cats and dogs 中比對 cat。這個正規表示式包含一系列三個字元。這就像告訴正規表示式引擎:尋找一個 c,緊接著一個 a,緊接著一個 t

請注意,預設情況下正規表示式引擎會區分大小寫。cat 無法比對 Cat,除非您指示正規表示式引擎忽略大小寫差異。

特殊字元

由於我們想要做的不只是搜尋文字的字面片段,因此我們需要保留特定字元以供特殊用途。在 本教學課程中討論的正規表示式風格 中,有 12 個具有特殊意義的字元:反斜線 \、插入符號 ^、美元符號 $、句點 .、直線或垂直線符號 |、問號 ?、星號 *、加號 +、左括弧 (、右括弧 )、左方括弧 [ 和左大括弧 {,這些特殊字元通常稱為「後設字元」。大多數字元在單獨使用時都是錯誤的。

如果您想在正規表示式中將其中任何一個字元用作字面值,您需要使用反斜線對其進行跳脫。如果您想比對 1+1=2,正確的正規表示式為 1\+1=2。否則,加號具有特殊意義。

請注意,省略反斜線的 1+1=2 是有效的正規表示式。因此,您不會收到錯誤訊息。但它無法比對 1+1=2。它會在 123+111=234 中比對 111=2,這是因為 加號字元 具有特殊意義。

如果您忘記在不允許使用特殊字元的地方對其進行跳脫,例如 +1,則您會收到錯誤訊息。

大多數正規表示法風味將大括弧 { 視為字面字元,除非它是重複運算子的一部分,例如 a{1,3}。因此,通常不需要用反斜線跳脫它,但如果你願意,可以這麼做。但有幾個例外。Java 要求跳脫字面開括弧。Booststd::regex 要求跳脫所有字面大括弧。

]字元類別 外部是字面字元。在字元類別內部套用不同的規則。這些規則在關於字元類別的主題中討論。同樣地,有例外。std::regexRuby 要求跳脫關閉方括弧,即使在字元類別外部也是如此。

所有其他字元不應該用反斜線跳脫。這是因為反斜線也是特殊字元。反斜線與字面字元結合可以使用特殊意義建立正規表示法代碼。例如,\d簡寫,用於比對從 09 的單一數字。

用反斜線跳脫單一元字元在所有正規表示法風味中都能運作。有些風味也支援 \Q\E 跳脫序列。介於 \Q\E 之間的所有字元都解釋為字面字元。例如,\Q*\d+*\E 比對字面文字 *\d+*\E 可以省略在正規表示法的結尾,因此 \Q*\d+*\Q*\d+*\E 相同。這個語法由 JGsoft 引擎PerlPCREPHPDelphiJava 支援,在 字元類別 內部和外部都支援。不過,Java 4 和 5 有錯誤會導致 \Q\E 發生異常,因此你不應該在 Java 中使用這個語法。Boost 在字元類別外部支援它,但在字元類別內部不支援。

特殊字元和程式語言

如果你是一位程式設計師,你可能會驚訝於單引號和雙引號等字元不是特殊字元。這是正確的。當使用 正規表示法或 grep 工具,例如 PowerGREP 或 文字編輯器(例如 EditPad Pro)的搜尋功能時,不應該像在程式語言中那樣跳脫或重複引號字元。

在您的原始碼中,您必須記住程式語言中哪些字元在字串內會獲得特殊處理。這是因為這些字元會在 regex 函式庫看到字串之前,由編譯器處理。因此 regex 1\+1=2 必須寫成 C++ 程式碼中的 "1\\+1=2"。C++ 編譯器會將原始碼中的跳脫反斜線轉換為傳遞給 regex 函式庫的字串中的單一反斜線。若要比對 c:\temp,您需要使用 regex c:\\temp。作為 C++ 原始碼中的字串,此 regex 會變成 "c:\\\\temp"。確實需要四個反斜線來比對一個反斜線。

請參閱本網站的 工具和語言 部分,以取得有關如何在各種程式語言中使用正規表示式的更多資訊。