快速入門
教學
工具和語言
範例
參考
書籍評論
歡迎
簡介
正規表示式快速入門
正規表示式教學
替換字串教學
應用程式和語言
正規表示式範例
正規表示式參考
替換字串參考
書籍評論
可列印 PDF
關於本網站
RSS Feed 和部落格
RegexBuddy—Better than a regular expression tutorial!

正規表示式快速入門

這個快速入門可讓您快速了解正規表示式。顯然地,這個簡短的簡介無法解釋正規表示式的全部內容。如需詳細資訊,請參閱正規表示式教學。快速入門中的每個主題都對應教學中的某個主題,因此您可以輕鬆地在兩者之間來回切換。

許多應用程式和程式語言都有自己的正規表示式實作,通常與其他實作略有不同,有時甚至有顯著差異。當兩個應用程式使用不同的正規表示式實作時,我們會說它們使用不同的「正規表示式風格」。這個快速入門說明了最受歡迎的正規表示式風格所支援的語法。

文字模式和比對

正規表示式,簡稱 regex,是一種描述一定量文字的模式。在此網站上,正規表示式會以灰色陰影顯示為 regex。這實際上是一個完全有效的 regex。這是最基本的模式,僅比對文字 regex。比對會在此網站上以藍色突顯。我們使用「字串」一詞來表示套用正規表示式的文字。字串會以 綠色 突顯。

在正規表示式中具有特殊意義的字元會以各種不同的顏色突顯。regex (?x)([Rr]egexp?)\? 以紫色顯示元標記,以綠色顯示群組,以橘色顯示字元類別,以藍色顯示量詞和其他特殊標記,並以灰色顯示跳脫字元。

文字字元

最基本的正規表示式包含一個單一的文字字元,例如 a。它會比對字串中該字元的第一次出現。如果字串是 Jack is a boy,它會比對 J 之後的 a

這個正規表示法也可以匹配第二個 a。它只會在您告訴正規表示法引擎在第一次匹配後開始搜尋字串時執行此操作。在文字編輯器中,您可以使用其「尋找下一個」或「向前搜尋」功能來執行此操作。在程式語言中,通常有一個獨立的功能,您可以呼叫它來在先前的匹配後繼續搜尋字串。

十二個字元在正規表示法中具有特殊意義:反斜線 \、插入符號 ^、美元符號 $、句點或圓點 .、垂直線或管道符號 |、問號 ?、星號或星形 *、加號 +、開啟括弧 (、關閉括弧 )、開啟方括弧 [ 和開啟大括弧 {。這些特殊字元通常稱為「元字元」。大多數單獨使用時會產生錯誤。

如果您想在正規表示法中將任何這些字元用作文字,您需要使用反斜線跳脫它們。如果您想匹配 1+1=2,正確的正規表示法是 1\+1=2。否則,加號具有特殊意義。

深入瞭解文字字元

不可列印字元

您可以使用特殊字元序列將不可列印字元放入您的正規表示法中。使用 \t 來匹配一個標籤字元(ASCII 0x09),\r 來匹配回車(0x0D)和 \n 來匹配換行(0x0A)。更特別的不可列印字元有 \a(鈴聲,0x07),\e(跳脫,0x1B),\f(換頁,0x0C)和 \v(垂直標籤,0x0B)。請記住,Windows 文字檔案使用 \r\n 來終止列,而 UNIX 文字檔案使用 \n

如果您的應用程式支援 Unicode,請使用 \uFFFF\x{FFFF} 來插入一個 Unicode 字元。 \u20AC\x{20AC} 匹配歐元貨幣符號。

如果您的應用程式不支援 Unicode,請使用 \xFF 來透過字元集中的十六進位索引來匹配一個特定字元。 \xA9 在 Latin-1 字元集中匹配版權符號。

所有不可列印字元都可直接用於正規表示式中,或作為字元類別的一部分。

進一步瞭解不可列印字元

字元類別或字元集

「字元類別」只會比對幾個字元中的其中一個。若要比對 a 或 e,請使用 [ae]。您可以在 gr[ae]y 中使用此方法來比對 graygrey。字元類別只會比對單一字元。gr[ae]y 不會比對 graaygraey 或任何類似字串。字元類別中字元的順序並不重要。

您可以在字元類別中使用連字號來指定字元範圍。[0-9] 會比對 0 到 9 之間的單一數字。您可以使用多個範圍。[0-9a-fA-F] 會比對單一十六進位數字,不分大小寫。您可以結合範圍和單一字元。[0-9a-fxA-FX] 會比對十六進位數字或字母 X。

在開啟方括號後輸入插入符號會否定字元類別。結果是字元類別會比對不在字元類別中的任何字元。q[^x] 會在 question 中比對 qu。它不會比對 Iraq,因為在 q 之後沒有字元供否定的字元類別比對。

進一步瞭解字元類別

簡寫字元類別

\d 會比對單一數字字元,\w 會比對「字元字元」(字母數字字元加上底線),而 \s 會比對空白字元(包括標籤和換行符號)。簡寫實際比對的字元取決於您使用的軟體。在現代應用程式中,它們包含非英文字母和數字。

深入了解簡寫字元類別

點號匹配(幾乎)任何字元

點號匹配單一字元,換行字元除外。大多數應用程式都有「點號匹配所有」或「單行」模式,讓點號匹配任何單一字元,包括換行字元。

gr.y 匹配 graygreygr%y 等。請謹慎使用點號。通常,字元類別或否定字元類別速度更快、更精確。

深入了解點號

錨點

錨點不匹配任何字元。它們匹配位置。 ^ 匹配字串開頭,$ 匹配字串結尾。大多數正規表示式引擎都有「多行」模式,讓 ^ 在任何換行後匹配,$ 在任何換行前匹配。例如,^b 僅匹配 bob 中的第一個 b

\b 匹配字詞邊界。字詞邊界是 \w 可以匹配的字元與 \w 無法匹配的字元之間的位置。如果字串的第一個和/或最後一個字元是字詞字元,\b 也會在字串開頭和/或結尾匹配。 \B 匹配 \b 無法匹配的每個位置。

深入了解錨點

交替

交替是正規表示式中「或」的等效項。 cat|dogAbout cats and dogs 中匹配 cat。如果再次套用正規表示式,它會匹配 dog。您可以新增任意數量的選項:cat|dog|mouse|fish

交替具有所有正規運算符中最低的優先順序。cat|dog food 符合 catdog food。若要建立符合 cat fooddog food 的正規運算式,您需要將交替選項分組:(cat|dog) food

深入了解交替

重複

問號使正規運算式中的前一個代幣成為選用。 colou?r 符合 colourcolor

星號或星號告訴引擎嘗試將前一個代幣符合零次或多次。加號告訴引擎嘗試將前一個代幣符合一次或多次。<[A-Za-z][A-Za-z0-9]*> 符合沒有任何屬性的 HTML 標籤。<[A-Za-z0-9]+> 較容易撰寫,但會符合無效的標籤,例如 <1>

使用大括號指定特定的重複次數。使用 \b[1-9][0-9]{3}\b 來符合介於 1000 至 9999 之間的數字。\b[1-9][0-9]{2,4}\b 符合介於 100 至 99999 之間的數字。

深入了解量詞

貪婪和懶惰重複

重複運算符或量詞是貪婪的。它們會盡可能擴充符合範圍,並且僅在必須時才回退以符合正規運算式的其餘部分。正規運算式 <.+>This is a <EM>first</EM> test 中符合 <EM>first</EM>

在量詞後加上問號,使其變為非貪婪模式。 <.+?> 在上述字串中會比對出 <EM>

更好的解法是遵循我的建議,盡量少用點號。使用 <[^<>]+> 可以快速比對 HTML 標籤,而不用考慮屬性。否定字元類別比點號更具體,這有助於 regex 引擎快速找到比對結果。

深入了解貪婪和非貪婪量詞

群組和擷取

在多個標記周圍加上括號,將它們群組在一起。然後可以對群組套用量詞。例如:Set(Value)? 會比對出 SetSetValue

括號會建立一個擷取群組。上述範例有一個群組。在比對之後,如果比對到 Set,群組編號一不會包含任何內容。如果比對到 SetValue,群組編號一會包含 Value。如何存取群組的內容取決於您使用的軟體或程式語言。群組編號零永遠包含整個 regex 比對結果。

使用特殊語法 Set(?:Value)? 來群組標記,而不建立擷取群組。如果您不打算使用群組的內容,這樣會更有效率。不要將非擷取群組語法中的問號與量詞混淆。

深入了解群組和擷取

反向參照

在正規表示式中,您可以使用反向參照 \1 來比對與擷取群組比對到的相同文字。 ([abc])=\1 會比對出 a=ab=bc=c。它不會比對出任何其他內容。如果您的 regex 有多個擷取群組,它們會從左到右依據其開啟括號的順序編號。

深入了解反向參照

命名群組和反向參照

如果您的正規表示式有許多群組,追蹤其數字可能會很麻煩。透過命名您的群組,讓您的正規表示式更易於閱讀。(?<mygroup>[abc])=\k<mygroup>([abc])=\1 相同,但您可以透過其名稱來參考群組。

進一步了解命名群組

Unicode 屬性

\p{L} 符合給定 Unicode 類別中的單一字元。L 代表字母。\P{L} 符合不在給定 Unicode 類別中的單一字元。您可以在教學課程中找到 Unicode 類別的完整清單

進一步了解 Unicode 正規表示式

環顧

環顧是一種特殊類型的群組。群組內的代碼會正常配對,但正規表示式引擎會讓群組放棄其配對,並僅保留結果。環顧會配對位置,就像錨點一樣。它不會擴充正規表示式配對。

q(?=u) 會配對 qquestion 中,但不會在 Iraq 中配對。這是正向環顧。 u 不是整體正規表示式配對的一部分。環顧會在字串中 u 前的每個位置配對。

q(?!u) 會配對 qIraq 中,但不會在 question 中配對。這是負向環顧。環顧內的代碼會嘗試配對,其配對會被捨棄,而結果會被反轉。

若要向後環顧,請使用後向環顧。正向後向環顧 (?<=a)b 會配對 babc 中。負向後向環顧 (?<!a)b 無法配對 abc

您可以在環顧內使用完整的正規表示式。大多數應用程式僅允許在後向環顧中使用固定長度的表示式。

進一步了解環顧

自由間距語法

許多應用程式都有選項,標籤可能是「自由間距」或「忽略空白」或「註解」,這會讓正規表示式引擎忽略未跳脫的空白和換行符號,並讓 # 字元開始註解,直到該行結束。這允許您使用空白來格式化您的正規表示式,讓人類更容易閱讀,因此也更容易維護。

深入了解自由間距