簡析正規表示式

2022-03-31 07:08:02 字數 2793 閱讀 4285

前段時間我利用業餘時間開發了一套基於標籤的cms系統,在其中為了處理基於標籤的資料提取與資料填充大量的使用了正規表示式,在這裡將我將正規表示式的語法和用法進行簡單的描述,然後下篇中將介紹在c#中利用正規表示式的方法與**例項。

什麼是正規表示式

基本說來,正規表示式是一種用來描述一定數量文字的模式。regex代表regular express。我們使用一種自定義的模式來匹配一定數量的文字,並從中提取所需資料。如同window的萬用字元,如:*.txt查詢所有txt檔案。*就被解釋成任意字元。

乙個簡單的正規表示式

作為慣例,我們都是從hello world開始的。那麼這裡同樣這樣開始。為了匹配hello world這11個字元,正規表示式為:^hello\sworld$。其中^代表開頭的錨點、$代表結束的錨點、\s代表匹配乙個空格。乙個重要的注意事項,正規表示式是佔位的,也就是說,正規表示式中的乙個字元一定要對應實際文字中的乙個字元。如上面的正規表示式就不能匹配」 hello world」,因為」 hello….」前面多了乙個空格。

另乙個正規表示式

如果我們需要匹配乙個ipv4的ip位址;總所周知,ip位址分為4段,每段以』.』分割。每段大小在0-255之間。其中前三段都以』.』結尾,最後一段沒有。經過分析得到如下結論。

1) 前三段的匹配模式是相同的,最後一段的匹配模式與前三段只是不以』.』結尾

2) ipv4的ip位址每段範圍在0-255之間。可以是0-9,可以是10-99,也可以是100-255。其中需要主要的是100-199範圍和200-255範圍,如果首位以1開頭,則後兩位可以是任意數字,如果首位以2開頭,第二位只能是0-5,而且,當第二位是0-4的時候第三位可以是任意數字,當第二位是5的時候第三位只能是0-5

下面我們寫出符合上面第二點的匹配模式

① 當首位是2,且第二位是0-4的時候:2[0-4]\d,

② 當首位是2,且第二位是5的時候:25[0-5]

③ 當首位是0或則1的時候,第二三位可以是任意數字:[01]\d\d

④ 當首位不是0-2的時候,這時該位址就不能是100-255的範圍,只能是0-9或者10-99的範圍,當在0-9範圍的時候,一位任意數字就可以:\d,當在10-99的時候,兩位數字就可以:\d;

⑤ 然後觀察第③和第④點可以發現,當首位是0-1而且出現三位的時候應用第③點,當首位不是0-1且不是三位時應有第④點。變可以融合第③④點為:[01]?\d\d?

現在每段0-255範圍的匹配模式已經書寫完成了,然後考慮前三段以』.』結尾的問題,最終獲得匹配模式: ^(2[0-4]\d|25[0-5]|[01]?\d\d?\.)(2[0-4]\d|25[0-5]|[01]?\d\d?)$

元字元通過以上的兩個例項,相信大家已經對正規表示式有了乙個初步的理解,現在這裡列出正規表示式的元字元,元字元的定義和語言的關鍵字含義類似,都是一些在系統中有特殊含義的字元。

1) 『.』 :匹配任意字元

2) \w :匹配字母或數字或下劃線或漢字

3) \s :匹配空白字元

4) \d :匹配任意數字

5) \b :匹配開頭或則結尾

6) ^ :匹配字串的開頭

7) $ :匹配字串的結尾

重複與貪婪重複和惰性重複

重複的含義是指重複匹配滿足某一匹配模式的文字。如例中(匹配ip)的』?』號就是乙個重複的例子,它的含義是某一匹配模式,至多出現一次。以下列出一些重複的標示:

1) * :星號,重複任意多次,如:\w*,代表任意字母,數字,下劃線,漢字出現任意多次

2) + :加號:至少出現一次,如:\d+,代表任意數字至少出現一次

3) ? :問好:至多出現一次(出現一次或則不出現),如:\s?,代表空白字元出現0或則1次

4) :n代表任意數字,如:.,代表任意字元出現5次

5) :n代表任意數字,如:\d,代表任意數字出現5到多次

6) :n,m代表任意數字,如:\d,代表任意數字出現5到10次

貪婪與惰性匹配

首先看乙個正規表示式例子:「<.*>」

這個正規表示式將匹配以』<』開頭,』>』結尾中間任意次任意字元,如:

,,等。當如果用該正規表示式去匹配hello world

的話被匹配出的文字就是hello world

,因為預設情況下正規表示式是貪婪匹配。正規表示式引擎或缺省情況下將預設搜尋最後乙個匹配錨點。所以本例中的最後匹配錨點是

的》而不是的》。這便是貪婪匹配。

既然明白有貪婪匹配,就必然需知惰性匹配

以上為上面這個正規表示式例子稍作改動:<.*?>,我們在*後面加上乙個問號便告訴引擎按照惰性匹配的方式進行搜尋,使用這個正規表示式匹配hello world

得到的結果會有兩個,乙個是另乙個是

。因為我們沒有限定開頭和結尾。

字符集,分歧,反義

字符集:[a-za-z0-9],匹配乙個字元,這個字元是a-za-z0-9中的任意乙個

分歧:(a|b)*,a或則b出現任意多次

反義:[^ab]+,非a和b出現至少一次

分組正規表示式的分組以()小括號進行標示,如:(\w*)。標示將\w*劃分為乙個匹配單元,及分組。<(\w+?)[a-za-z0-9"=\s]*>.*?這個正規表示式能夠匹配如:hello world

段,值得注意的是我們將\w+進行了分組,然後再後面使用\1引用本分組。預設情況下,引擎將至左向右將第乙個分組命名為第1組,第二個分組命名為第2組......我們也能顯示的給分組命名,本例項中正規表示式也能寫成:<(?\w+?)[a-za-z0-9"=\s]*>.*?>我們將\w+的分組命名為g1,以後通過\k引用。

**自

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

非負整數 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正規表示式 編寫正規表示式

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