正規表示式各個字元的解釋

2022-04-01 18:06:01 字數 3718 閱讀 5113

正規表示式作為簡單快速匹配性的字元式在程式開發中不可缺少的一位,會點簡單的正規表示式可以讓你少些很多**,何樂而不為呢?

作為乙個程式設計師如果說不會正則真的有點說不過去了,好了廢話不多說了看解釋

正規表示式字元介紹:詳細的可見維基百科介紹

//常用字元的使用介紹

在正規表示式中 \ 的意思是代表轉義字元

在正規表示式中 . 的意思是代表任意字元

在正規表示式中 * 的意思是代表任意個字元(包含零個)

在正規表示式中 + 的意思是代表乙個或者多個字元(不包含零個)

在正規表示式中^ 的意思是代表開始位置(如果用在[之內也有相反的意思])

在正規表示式中 $ 的意思是代表結束位置

在正規表示式中 [……]的意思是代表或者的意思比如[a-za-z]的意思是a到z或者a-z之間的隨意乙個都可以

在正規表示式中(.....) 的意思是代表分組

在正規表示式中 $1 的意思是代表引用分組1的資料

在正規表示式中 的意思是代表相同的4個;這裡代表是量詞的意思,比如說:

(/d/d/d/d是四個數字但是可以簡寫為/d;這裡包含前面的字元,一共四次,迴圈了三次)

也可以是

(/d;這裡包含前面的字元,共2到4個數字,迴圈了一到三次)

在正規表示式中 /d 的意思是代表數字

在正規表示式中 /d 的意思是代表非數字

在正規表示式中 /b 的意思是代表乙個單詞的邊界

在正規表示式中 /b 的意思是代表非單詞的邊界

在正規表示式中 /g 的意思是代表全域性(global)

在正規表示式中 /i 的意思是代表忽略大小寫,(ignore case)預設大小寫敏感

在正規表示式中 /m 的意思是代表多行,(multiple lines )多行搜尋

預定義類:

在正則中特殊字元大寫表示取反,比如/d代表數字,則/d代表非數字與[^0-9]相同

字元 等價類 含義

. [^\r\n] 除了回車符合換行符之外所有的字元

\d [0-9] 數字字元

\d [0-9] 非數字字元

\s [\t\n\x0b\f\r] 空白符

\s [^\t\n\x0b\f\r] 非空白符

\w [a-za-z_0-9] 單詞字元(字母,數字下劃線)

\w [^a-za-z_0-9] 非單詞字元

維基百科部分介紹

歷史[編輯]

最初的正規表示式出現於理論電腦科學的自動控制理論和形式化語言理論中。在這些領域中有對計算(自動控制)的模型和對形式化語言描述與分類的研究。

2023年,warren mcculloch與walter pitts將神經系統中的神經元描述成小而簡單的自動控制元。

2023年代,數學家史蒂芬·科爾·克萊尼利用稱之為「正則集合」的數學符號來描述此模型。肯·湯普遜將此符號系統引入編輯器qed,隨後是unix上的編輯器ed,並最終引入grep。自此以後,正規表示式被廣泛地應用於各種unix或類unix系統的工具中。

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

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

(「空集」)?指示集合?

(「空串」)ε指示集合

(「文字字元」)在σ中的a指示集合

定義了下列運算:

(「串接」)rs指示集合。例如: = 。

(「選擇」)r|s指示r和s的並集。例如:|=

(「kleene星號」)r* 指示包含ε並且閉合在字串串接下的r的最小超集。這是可以通過r中的零或多個字串的串接得到所有字串的集合。例如,* = 。

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

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

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

例子:a|b*指示。

(a|b)*指示由包括空串、任意數目個a或b字元組成的所有字串的集合。

ab*(c|ε)指示開始於乙個a接著零或多個b和最終可選的乙個c的字串的集合。

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

這種意義上的正規表示式可以表達正則語言,精確的是可被有限狀態自動機接受的語言類。但是在簡潔性上有重要區別。某類正則語言只能用大小指數增長的自動機來描述,而要求的正規表示式的長度只線性的增長。

正規表示式對應於喬姆斯基層級的型別-3文法。在另一方面,在正規表示式和不導致這種大小上的**的非確定有限狀態自動機(nfa)之間有簡單的對映;為此nfa經常被用作正規表示式的替代表示。

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

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

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

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

基本語法[編輯]

乙個正規表示式通常被稱為乙個模式(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」是相同的。

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

表示式全集[編輯]

正規表示式有多種不同的風格。下表是在pcre中元字元及其在正規表示式上下文中的行為的乙個完整列表,適用於perl或者python程式語言(grep或者egrep的正規表示式文法是pcre的子集):

正規表示式 匹配多個字元

功能 匹配前乙個字元出現0次或者無限次,即可有可無 匹配前乙個字元出現1次或者無限次,即至少有1次 匹配前乙個字元出現1次或者0次,即要麼有1次,要麼沒有 匹配前乙個字元出現m次 匹配前乙個字元出現從m到n次 需求 匹配出乙個字串第乙個字母為大小字元,後面都是小寫字母並且這些小寫字母可 有可無 im...

匹配正則 正規表示式 單個字元匹配

通過re模組能夠完成使用正規表示式來匹配字串 功能.匹配任意1個字元 除了 匹配 中列舉的字元d匹配數字,即0 9d匹配非數字,即不是數字s匹配空白,即 空格,tab鍵s匹配非空白w匹配非特殊字元,即a z a z 0 9 漢字w匹配特殊字元,即非字母 非數字 非漢字 import reret re...

正規表示式匹配多個字元 4

4.1 匹配多個字元 功能 匹配前乙個字元出現0次或者無限次,即可有可無 匹配前乙個字元出現1次或者無限次,即至少有1次 匹配前乙個字元出現1次或者0次,即要麼有1次,要麼沒有 匹配前乙個字元出現m次 匹配前乙個字元出現從m到n次 匹配前乙個字元出現至少m次 示例1 需求 匹配出乙個字串第乙個字母為...