快速開始
教學
工具和語言
範例
參考
書籍評論
Regex 工具
grep
PowerGREP
RegexBuddy
RegexMagic
一般應用程式
EditPad Lite
EditPad Pro
語言和函式庫
Boost
Delphi
GNU (Linux)
Groovy
Java
JavaScript
.NET
PCRE (C/C++)
PCRE2 (C/C++)
Perl
PHP
POSIX
PowerShell
Python
R
Ruby
std::regex
Tcl
VBScript
Visual Basic 6
wxWidgets
XML Schema
Xojo
XQuery 和 XPath
XRegExp
資料庫
MySQL
Oracle
PostgreSQL
本網站的更多資訊
簡介
正規表示式快速開始
正規表示式教學
替換字串教學
應用程式和語言
正規表示式範例
正規表示式參考
替換字串參考
書籍評論
可列印 PDF
關於本網站
RSS 饋送和部落格
RegexBuddy—The best regex editor and tester for GNU users!

GNU 正規表示式擴充套件

GNU 是「GNU's Not Unix」的縮寫,是一個專案,致力於為全球提供所有在 Unix 系統上常見工具的免費和開放原始碼實作。大多數 Linux 系統都隨附完整的 GNU 應用程式套件。這顯然包括傳統的正規表示式工具程式,例如 grep、sed 和 awk。

GNU 對這些工具的實作遵循 POSIX 標準,並新增 GNU 擴充套件。GNU 擴充套件的效果是 基本正規表示式 風格和 延伸正規表示式 風格都提供完全相同的功能。唯一的差別是 BRE 會使用反斜線讓各種字元具有特殊意義,而 ERE 會使用反斜線取消相同字元的特殊意義。

GNU 基本正規表示式 (grep、ed、sed)

基本正規表示式或 BRE 風格幾乎是當今仍在使用的最古老的正規表示式風格。GNU 工具程式 grep、ed 和 sed 使用它。讓此風格與眾不同的其中一件事是,大多數的元字元都需要反斜線才能讓元字元具有其風格。包括 GNU ERE 在內的大多數其他風格都使用反斜線來取消元字元的意義。使用反斜線來跳脫從來都不是元字元的字元是錯誤的。

BRE 支援 POSIX 方括號表示式,類似於其他 regex 風格中的字元類別,並具有一些特殊功能。使用一般元字元的其他功能包括 ,用來比對換行符號以外的任何字元;插入符號和美元符號,用來比對字串的開頭和結尾;以及 星號,用來重複令牌零次或多次。若要逐字比對這些字元,請使用反斜線跳脫它們。

其他 BRE 元字元需要反斜線才能賦予它們特殊意義。原因是 UNIX grep 的最舊版本不支援這些元字元。grep 的開發人員希望讓它與現有的正規表示式相容,而現有的正規表示式可能會將這些字元當成字面字元使用。BRE a{1,2} 會將 a{1,2} 視為字面值,而 a\{1,2\} 會將 aaa 視為相符。可以將代碼塊用 \(\) 分組。反向參照是常見的 \1\9。最多只允許 9 個群組。例如:\(ab\)\1 會將 abab 視為相符,而 (ab)\1 則無效,因為沒有對應於反向參照 \1 的擷取群組。使用 \\1\1 視為字面值。

除了上面說明的 POSIX BRE 提供的內容之外,GNU 延伸功能提供 \?\+ 作為 \{0,1\}\{1,\} 的替代語法。它透過 \| 加入交替,這是 POSIX BRE 嚴重缺乏的功能。事實上,這些延伸功能表示 GNU BRE 具有與 GNU ERE 完全相同的功能,只不過 +?|、大括號和圓括號需要反斜線才能賦予它們特殊意義,而不是取消特殊意義。

GNU 延伸正規表示式 (egrep、awk、emacs)

延伸正規表示式或 ERE 風格是由 GNU 工具程式 egrep 和 awk 以及 emacs 編輯器所使用。在此脈絡中,「延伸」純粹是歷史上的稱呼。GNU 延伸功能讓 BRE 和 ERE 風格在功能上相同。

所有元字元在沒有反斜線的情況下都有其意義,就像在現代正規表示式風格中一樣。您可以使用反斜線來取消所有元字元的意義。將非元字元轉譯成跳脫字元會產生錯誤。

量化詞 ?+{n}{n,m}{n,} 分別重複前一個代碼塊 0 次或 1 次、1 次或多次、n 次、n 到 m 次,以及 n 次或更多次。交替透過常見的垂直線 | 來支援。未加裝飾的圓括號會建立一個群組,例如:(abc){2} 會將 abcabc 視為相符。

POSIX ERE 不支援 反向參照。GNU 延伸功能使用相同的 \1\9 語法加入反向參照。

其他 GNU 延伸功能

GNU 延伸功能不僅讓兩種風格相同,還加入了一些新的語法和幾個全新的功能。您可以使用 簡寫類別 \w\W\s\S 來取代 [[:alnum:]_][^[:alnum:]_][[:space:]][^[:space:]]。您可以在正規表示式中直接使用這些類別,但不能在方括號表示式中使用。方括號表示式中的反斜線永遠是字面意思。

新功能包括 字元邊界錨點。GNU 和現代風格一樣,支援 \b 來比對字元邊界位置,以及 \B 來比對非字元邊界位置。 \< 比對字首位置,而 \> 比對字尾位置。錨點 \` (反引號) 比對主旨字串的開頭,而 \' (單引號) 比對主旨字串的結尾。這些功能對一次比對多行文字的工具很有用,因為 ^ 會比對行首,而 $ 會比對行尾。

Gnulib

如果您無法在自己的 (開源) 應用程式中使用 GNU 的正規表示式實作,那 GNU 就不是 GNU 了。若要這麼做,您需要 下載 Gnulib。使用隨附的 gnulib-tool 將正規表示式模組複製到您的應用程式原始碼樹。

正規表示式模組提供標準 POSIX 函式 regcomp() 來編譯正規表示式、regerror() 來處理編譯錯誤、regexec() 來使用編譯的正規表示式執行搜尋,以及 regfree() 來清除您已用完的正規表示式。

| 快速入門 | 教學 | 工具與語言 | 範例 | 參考 | 書籍評論 |

| grep | PowerGREP | RegexBuddy | RegexMagic |

| EditPad Lite | EditPad Pro |

| Boost | Delphi | GNU (Linux) | Groovy | Java | JavaScript | .NET | PCRE (C/C++) | PCRE2 (C/C++) | Perl | PHP | POSIX | PowerShell | Python | R | Ruby | std::regex | Tcl | VBScript | Visual Basic 6 | wxWidgets | XML Schema | Xojo | XQuery & XPath | XRegExp |

| MySQL | Oracle | PostgreSQL |