快速入門
教學
工具和語言
範例
參考
書籍評論
正規表示式工具
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 Feed 和部落格
RegexBuddy—The best regex editor and tester for POSIX developers!

POSIX 基本正規表示式

POSIX 或「uniX 的可攜式作業系統介面」是一系列標準,定義 (UNIX) 作業系統應支援的部分功能。其中一項標準定義了兩種正規表示式風格。grep 和 egrep 等涉及正規表示式的指令在相容 POSIX 的 UNIX 系統上實作這些風格。多個資料庫系統也使用 POSIX 正規表示式。

基本正規表示式或 BRE 風格標準化一種與傳統 UNIX grep 指令所使用的風格類似的風格。這幾乎是現今仍在使用的最古老的正規表示式風格。讓這種風格與眾不同的一點是,大多數的後設字元需要反斜線才能賦予後設字元其風格。包括 POSIX ERE 在內的大多數其他風格使用反斜線來抑制後設字元的意義。使用反斜線來跳脫從未是後設字元的字元是一種錯誤。

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

其他 BRE 元字元需要反斜線才能賦予它們特殊意義。原因是 UNIX grep 的最舊版本不支援這些元字元。grep 的開發人員想要讓它與現有的正規表示式相容,而這些正規表示式可能會將這些字元用作字面字元。BRE a{1,2} 會將 a{1,2} 視為字面值,而 a\{1,2\} 會比對 aaa。有些實作支援 \?\+ 作為 \{0,1\}\{1,\} 的替代語法,但 \?\+ 並非 POSIX 標準的一部分。代幣可以用 \(\) 分組。反向參照是常見的 \1\9。最多只允許 9 個群組。例如,\(ab\)\1 會比對 abab,而 (ab)\1 無效,因為沒有對應於反向參照 \1 的擷取群組。使用 \\1 來將 \1 視為字面值。

POSIX BRE 不支援任何其他功能。甚至 交替 也不支援。

POSIX 延伸正規表示式

延伸正規表示式或 ERE 風格標準化了類似 UNIX egrep 指令所使用的風格。「延伸」是相對於原始 UNIX grep,它只有方括號表示式、點、插入符號、美元符號和星號。ERE 支援這些內容,就像 BRE 一樣。大多數現代正規表示式風格都是 ERE 風格的延伸。根據今日的標準,POSIX ERE 風格相當陽春。POSIX 標準定義於 1986 年,而正規表示式自此已發展得相當成熟。

egrep 的開發人員沒有嘗試維持與 grep 的相容性,而是建立了一個獨立的工具。因此,egrep 和 POSIX ERE 加入額外的元字元,而沒有反斜線。你可以使用反斜線來抑制所有元字元的意義,就像在現代正規表示式風格中一樣。將非元字元轉義為錯誤。

量詞 ?+{n}{n,m}{n,} 分別重複前一個代幣 0 次或 1 次、1 次或多次、n 次、n 到 m 次,以及 n 次或更多次。交替由一般的垂直線 | 支援。未加裝飾的括號會建立一個群組,例如 (abc){2} 符合 abcabc。POSIX 標準未定義反向參照。有些實作支援 \1\9,但這些並非 ERE 標準的一部分。ERE 是舊 UNIX grep 的延伸,而非 POSIX BRE。

而延伸就只到此為止。

POSIX ERE 交替傳回最長符合項

在關於交替的教學主題中,我解釋了正規表示式引擎會在找到符合的替代項後立即停止。然而,POSIX 標準強制傳回最長符合項。將 Set|SetValue 套用至 SetValue 時,符合 POSIX 的正規表示式引擎會完全符合 SetValue。即使引擎是正規表示式導向 NFA 引擎,POSIX 仍要求它透過嘗試所有替代項,並傳回最長符合項(此情況為 SetValue)來模擬DFA 文字導向符合。傳統 NFA 引擎會符合 Set,就像本網站上討論的所有其他正規表示式風格一樣。

符合 POSIX 的引擎仍會找到最左符合項。如果您將 Set|SetValue 套用至 Set or SetValue 一次,它會符合 Set。字串中的第一個位置是我們的正規表示式可以找到有效符合項的最左位置。在字串中可以找到更長符合項的事實無關緊要。如果您再次套用正規表示式,並從字串中的第一個空格繼續,則會符合 SetValue。傳統 NFA 引擎會在字串開頭符合 Set 作為第一個符合項,並在字串中第 3 個字的開頭符合 Set 作為第二個符合項。

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

| 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 |