正規表示式

2021-08-26 04:32:02 字數 3116 閱讀 5735

正規表示式(英語:regular expression、regex或regexp,縮寫為re),也譯為正規表示法常規表示法,在電腦科學中,是指乙個用來描述或者匹配一系列符合某個句法規則的字串的單個字串。在很多文字編輯器或其他工具裡,正規表示式通常被用來檢索和/或替換那些符合某個模式的文字內容。許多程式語言都支援利用正規表示式進行字串操作。例如,在perl中就內建了乙個功能強大的正規表示式引擎。正規表示式這個概念最初是由unix中的工具軟體(例如sed和grep)普及開的。正規表示式通常縮寫成「regex」,單數有regexp、regex,複數有regexps、regexes、regexen。

regular expression的「regular」一般被譯為「正則」、「正規」、「常規」。此處的「regular」即是「規則」、「規律」的意思,regular expression即「描述某種規則的表示式」之意。

乙個正規表示式通常被稱為乙個模式 (pattern),為用來描述或者匹配一系列符合某個句法規則的字串。例如:handel、händel和haendel這三個字串,都可以由「h(a|ä|ae)ndel」這個模式來描述。大部分正規表示式的形式都有如下的結構:

選擇

|豎直分隔符代表選擇。例如「gray|grey」可以匹配grey或gray。

數量限定

某個字元後的數量限定符用來限定前面這個字元允許出現的個數。最常見的數量限定符包括「+」、「?」和「*」(不加數量限定則代表出現一次且僅出現一次):

+加號代表前面的字元必須至少出現一次。(1次、或多次)。例如,「goo+gle」可以匹配

google、

gooogle、

goooogle等;

?問號代表前面的字元最多隻可以出現一次。(0次、或1次)。例如,「colou?r」可以匹配

color或者

colour;

*星號代表前面的字元可以不出現,也可以出現一次或者多次。(0次、或1次、或多次)。例如,「0*42」可以匹配

42、042、

0042、

00042等。 匹配

圓括號可以用來定義操作符的範圍和優先度。例如,「gr(a|e)y」等價於「gray|grey」,「(grand)?father」匹配

father和

grandfather。

上述這些構造子都可以自由組合,因此,「h(ae?|ä)ndel」和「h(a|ae|ä)ndel」是相同的。

精確的語法可能因不同的工具或程式而異。

最初的正規表示式出現於理論電腦科學的自動控制理論和形式化語言理論中。在這些領域中有對計算(自動控制)的模型和對形式化語言描述與分類的研究。2023年代,warren mcculloch與walter pitts將神經系統中的神經元描述成小而簡單的自動控制元。在2023年代,數學家史蒂芬·科爾·克萊尼利用稱之為「正則集合」的數學符號來描述此模型。肯·湯普遜將此符號系統引入編輯器qed,然後是unix上的編輯器ed,並最終引入grep。自此,正規表示式被廣泛地使用於各種unix或者類似unix的工具,例如perl。

perl正規表示式源自於henry spencer寫的regex,它已經演化成了pcre(perl相容正規表示式,perl compatible regular expressions),乙個由philip hazel開發的,為很多現代工具所使用的庫。

各計算機語言之間的正規表示式的整合目前開展的很差。未來的perl6的子專案apocalypse的設計中已考慮到了這點。

正規表示式可以用形式化語言理論的方式來表達。正規表示式由常量和運算元組成,它們分別指示字串的集合和在這些集合上的運算。給定有限字母表 σ 定義了下列常量:

定義了下列運算:

上述常量和運算元形成了克萊尼代數。

很多課本使用對選擇使用符號∪,+或∨替代豎槓。

為了避免括號,假定 kleene 星號有最高優先順序,接著是串接,接著是並集。如果沒有歧義則可以省略括號。例如,(ab)c可以寫為abca|(b(c*))可以寫為a|bc*

例子:

正規表示式的形式定義故意非常精簡,避免定義多餘的量詞?+,它們可以被表達為:a+=aa*a?=(a|ε)。有時增加補運算元 ~ ;~r指示在 σ* 上的不在r中的所有字串的集合。補運算元是多餘的,因為它使用其他運算元來表達(儘管計算這種表示的過程是複雜的,而結果可能指數性的增大)。

這種意義上的正規表示式可以表達正則語言,精確的是可被有限狀態自動機接受的語言類。但是在簡潔性上有重要區別。某類正則語言只能用大小指數增長的自動機來描述,而要求的正規表示式的長度只線性的增長。正規表示式對應於喬姆斯基層級的型別-3文法。在另一方面,在正規表示式和不導致這種大小上的**的非確定有限狀態自動機(nfa)之間有簡單的對映;為此 nfa 經常被用作正規表示式的替代表示。

我們還要在這種形式化中研究表達力。如下面例子所展示的,不同的正規表示式可以表達同樣的語言: 這種形式化中存在著冗餘。

有可能對兩個給定正規表示式寫乙個演算法來判定它們所描述的語言是否本質上相等,簡約每個表示式到極小確定有限自動機,確定它們是否同構(等價)。

這種冗餘可以消減到什麼程度? 我們可以找到仍有完全表達力的正規表示式的有趣的子集嗎? kleene 星號和並集明顯是需要的,但是我們或許可以限制它們的使用。這提出了乙個令人驚奇的困難問題。因為正規表示式如此簡單,沒有辦法在語法上把它重寫成某種規範形式。過去公理化的缺乏導致了星號高度問題。最近 dexter kozen 用克萊尼代數公理化了正規表示式。

很多現實世界的「正規表示式」引擎實現了不能用正規表示式代數表達的特徵。

正規表示式 正規表示式 總結

非負整數 d 正整數 0 9 1 9 0 9 非正整數 d 0 負整數 0 9 1 9 0 9 整數 d 非負浮點數 d d 正浮點數 0 9 0 9 1 9 0 9 0 9 1 9 0 9 0 9 0 9 1 9 0 9 非正浮點數 d d 0 0 負浮點數 正浮點數正則式 英文本串 a za z...

正規表示式 表示式

網域名稱 a za z0 9 a za z0 9 a za z0 9 a za z0 9 interneturl a za z s 或 http w w w 手機號碼 13 0 9 14 5 7 15 0 1 2 3 5 6 7 8 9 18 0 1 2 3 5 6 7 8 9 d 號碼 x x x...

Linux正規表示式 編寫正規表示式

為了所有實用化的用途,你可以通過使用程式產生正確的結果。然而,並不意味著程式總是如你所願的那樣正確地工作。多數情況下,如果程式不能產生想要的輸出,可以斷定真正的問題 排除輸入或語法錯誤 在於如何描述想要的東西。換句話說,應該考慮糾正問題的地方是描述想要的結果的表示式。表示式不完整或者公式表示得不正確...