一、介紹
正則表達式
(英語:Regular Expression,常簡寫為 regex、regexp 或 RE )
此處的 Regular 即是規則、規律的意思,Regular Expression 即“描述某種規則的表達式”之意。
二、歷史
最初的正則表達式出現於理論計算機科學的自動控制理論和形式化語言理論中。在這些領域中有對計算(自動控制)的模型和對形式化語言描述與分類的研究。
1950年代,數學家斯蒂芬·科爾·克萊尼利用稱之為“正則集合”的數學符號來描述此模型。肯·湯普遜將此符號系統引入編輯器 QED,隨后是 Unix 上的編輯器 ed,並最終引入 grep。自此以后,正則表達式被廣泛地應用於各種 Unix 或類 Unix 系統的工具中。此時出現了POSIX 規范的正則表達式
。
Perl 正則表達式
源自於 Henry Spencer 於1986年1月19日發布的 regex。它后來演化成了 PCRE
(Perl 兼容正則表達式,Perl Compatible Regular Expressions),一個由 Philip Hazel 於1997年夏天開始編寫開發的,用 C 編寫的,為很多現代工具所使用的庫。 PCRE 的語法比 POSIX 正則表達式和許多其他正則表達式庫都強大和靈活。許多著名的開源程序(例如 Apache 和 Nginx HTTP 服務器以及 PHP 和 R 腳本語言)都包含 PCRE 庫。
各編程語言之間關於正則表達式的集成,雖開發進展得很差,但也在逐步推行。我所接觸過的,Python 中的正則比較完善,JavaScript 中的正則相對比較弱。
三、規范/流派
1、POSIX 規范的正則表達式
POSIX
( Portable Operating System Interface for unix )規范又可分為兩種流派(flavor):
- 基本的正則表達式(Basic Regular Expression,又叫 Basic RegEx,簡稱
BRE
) - 擴展的正則表達式(Extended Regular Expression,又叫 Extended RegEx,簡稱
ERE
)
應用范圍:
- Unix/Linux 下的工具
- 一些數據庫系統
(1)BRE
在 Linux/Unix 常用工具中,grep、vi、sed 都屬於 BRE 這一派。
后來 GNU 也對 BRE 做了擴展。這樣,GNU 的 grep 等工具雖然名義上屬於 BRE 流,但更確切的名稱是
GNU BRE
。
(2)ERE
注意:雖然 BRE 名為“基本”而 ERE 名為“擴展”,但 ERE 並不要求兼容 BRE 的語法,而是自成一體。
在 Linux/Unix 常用工具中,grep -E、sed -r、awk 都屬於 ERE 這一派。
后來 GNU 也對 ERE 做了擴展。這樣,GNU 的 egrep 等工具雖然名義上屬於 ERE 流,但更確切的名稱是
GNU ERE
。
(3)BRE 和 ERE 的區別
在 GNU 的拓展后,現在的 BRE 和 ERE 在功能上已經沒有什么區別了,主要的差異是在元字符的轉義上。
BRE需要對一些特殊字符進行轉義,例如在ERE中可以使用'|'、'+'、'?'
,而在BRE中則需要轉義才能正常使用,例如'\|'、'\+'、'\?'
。
BRE 之所以這么麻煩的要轉義,是因為這些工具的誕生時間很早,有歷史遺留問題。
2、Perl 正則表達式
Perl 正則表達式(Perl Regular Expression,又叫 Perl RegEx,簡稱 PRE
)
現在常見的正則表達式記法,其實大多都源於 Perl。例如『\d』、『\w』、『\s』之類的記法。
應用范圍:
- (高級)編程語言