正規表示式的學習

2021-06-27 17:52:34 字數 3724 閱讀 4261

正規表示式是對

字串操作的一種邏輯公式,就是用事先定義好的一些特定字元、及這些特定字元的組合,組成乙個「規則字串」,這個「規則字串」用來表達對字串的一種過濾邏輯。

給定乙個正規表示式和另乙個字串,我們可以達到如下的目的:

1. 給定的字串是否符合正規表示式的過濾邏輯(稱作「匹配」);

2. 可以通過正規表示式,從字串中獲取我們想要的特定部分。

正規表示式的特點是:

1. 靈活性、邏輯性和功能性非常的強;

2. 可以迅速地用極簡單的方式達到字串的複雜控制。

3. 對於剛接觸的人來說,比較晦澀難懂。

正規表示式有posix和pcre兩種風格的庫,前者是linux自帶的正規表示式庫,後者是perl的正規表示式的庫這裡選擇posix風格的正規表示式作為討論物件

$ egrep " a.*t$" /user/words 列出單詞表中a開頭t結尾的所有單詞

1.字符集和單詞

在正規表示式中,句點「.」用於匹配除去換行符之外的任意乙個字元,下面該正規表示式可以匹配 cat,tat,bat,這樣的字串

.at"."能夠匹配的字元範圍是最大的,上面的表示式還可匹配#at,~at,%at等這樣的字串

如果縮小選擇範圍是匹配更為精確

[a-z]at

該表示式限定at前的那個字元只能是小寫字元,其中表示用於指定乙個字符集,無論中又多少個字元,在實際工作中只能匹配其中乙個字元

如[abc]用於匹配a或b或c 而不能匹配ab,abc,bc等 而"-"用來描述乙個範圍,下面這條表示式匹配所有的英文本幕

[a-za-z]

數字也可以用範圍來指定[0-9]

egrep '[a-z]at'  /usr/words

該表示式匹配了包含cat bat這些單詞,並不是iwomen想要的

為了能夠嚴格匹配乙個單詞,需要為期加上一堆分隔符"\<"和"\>"

\<[a-z]at\>

該表示式就可以匹配a#$bat.bat!!!  bat's等但是不會匹配hebat,tacat等這樣的單詞

為什麼前者也被匹配呢?

這是因為單詞定義為 兩測由非單詞字元分割的字串,非單詞值得是字母、數字、下劃線之外的任何字元

2.字元類

除了字符集,該型別正規表示式還提供了預定義字元類來匹配某些特定的字元,

[[:upper:]]t$ words 列出該檔案下所有以大寫字母開頭,以小寫字母結尾的行

[[:upper:]]就是乙個字元類,表示所有的大寫字母,等價於[a-z],

注:posix正規表示式中得字元類

類                                               匹配字元

[[:alnum:]]                                    文字、數字字元

[[:alpha:]]                                     字母字元

[[:lower:]]

小寫字元

[[:upper:]]

大寫字元

[[:digit:]]                                      小數

[[:xdigit:]]                                     十六進製制數字

[[:punct]]                  

標點字元

[[:blank:]] 

製表符和空格

[[:space:]]  

空格[[:cntrl:]] 

所有控制符

[[:print:]] 

所有可以列印的字元

[[:graph:]] 

除空格外可以列印的字元

3.位置匹配

「^」和 "$" 分別用於匹配行首和行尾

^a[a-z]t$ 該表示式用於匹配所有以a開頭以t結尾a和t之間包含乙個小寫字母的行

「^」和"$"不必同時使用

^[0-9]該表示式匹配所有以數字開頭的行。

4.字元轉義"\"

句點表示除換行符之外的任意乙個字元,那麼如何匹配"."本身呢,這就用到轉義字元,「\.」匹配「.」

www\.google\.cn該表示式匹配www.google.cn

5.重複

使用者有時希望某個字元不止一次出現,正規表示式中得*表示在它前面的模式應該重複0次或者多次

^a.*t$ 該表示式表示所有以a開頭、以t結尾的行 

具體講解下,^a匹配以a開頭的行,.匹配乙個字元(除換行符)*表示指定之前的那個字元可以重複0次或者多次;t$匹配以t結尾的行

"+"指定一次或者更多次。"?"指定重複0次或者1次

\.+\該表示式表示匹配所有在單詞hi後面隔了乙個或者幾個字元後出現jerry的行

使用{}可以用來明確指定模式重複的次數。表示重複3次,而表示重複3次或者更多次表示重複的次數不少於5次,不多於12次

\<[1-9][0-9]\>該表示式匹配所有不少於8位的數

注:用於重複模式的元字元

元字元                                           描述

*                                            重複0次或者更多次

+                                          重複一次或者更多次

?                                       重複0次或者更多次

重複n次

重複n次或者更多次

重複不少於n次,不多於m次

6.子表示式

(or)該表示式匹配所有or重複2次或者更多次的行。

但是如果去掉or兩邊的()則,其匹配的是以o開頭r重複2次或者多次的行

7.反義

[^y]該表示式匹配除了字母y的任何字元

[^abdilh]該表示式則匹配除了a,b,d,i,l,h的所有字元

「^」在表示行首和反義時,在位置上得區別。

^[^y]匹配不以y開頭的行

8.分支

|表示或

^h|t$匹配以字母h開頭或者以t結尾的行

jan(uary|   |\.)|feb(uary|  |\.) |mar(ch|  |\.) |apr(il|   |\.) |may(   |\.)| jun(e|   |\.)  |jul(y|   |\.)|aug(ust |   |\.) |sep(tember|  |\.) |oct (ober|   |\.)  |nov(ember|  |\.) |dec(ember|   |\.)該表示式用於匹配1-12月份的英文寫法,包括縮寫和完整的寫法

以一月份表示式為例

jan(uary|  |\.)表示匹配january或者jan或者jan.

9.逆向引用

(\<.*\>).?(  )*\1

該表示式匹配所有在某個單詞出現後,緊跟著0個或者乙個標點符號,以及任意個空格之後再次出現這個單詞的行,例如cart cart、logn  logn  ha!ha!

解釋(\<.*\>)匹配任意長度的單詞 第乙個子表示式

.? 匹配0個或者1個標點符號 ,由於句點前匹配的是單詞,因此句點在這裡只能匹配標點

()* 匹配0個或者多個空格,第二個子表示式

\1指代第乙個字表示式匹配到得模式,如果第乙個字表示式匹配的表示式匹配的單詞為cart 那麼這裡也自動稱為cart

當然使用者也可以使用\2 \4等來正定編號為2.4的子表達hi匹配到得模式,子表示式的編號模式為從1開始,一次遞增。

正規表示式學習

概念 正規表示式,就是用某種模式去匹配一類字串的乙個公式。基礎 下表列出了所有的元字元和對它們的乙個簡短的描述。簡單例子 vi 命令作用 s g 把乙個或者多個空格替換為乙個空格 s 去掉行尾的所有空格 s 在每一行頭上加入乙個空格 s 0 9 0 9 去掉行首的所有數字字元 s b aeio g ...

正規表示式學習

1.元字元 1 匹配任何單個字元 2 匹配括號中的任何乙個字元 可以再括號中使用連字元 來指定子都的區間來簡化表示,如a 0123456789 c等價於a 0 9 c 3 將 之間括起來的表示式定義為 組 4 將兩個匹配條件進行邏輯 或 運算 z f ood則匹配 zood 或 food 5 匹配0...

正規表示式學習

只是點皮毛,先湊合用著了,順便鄙視一下sqlserver,居然不支援正則。b 元字元,代表著單詞的開頭或結尾,也就是單詞的分界處。d 數字 s 任意的空白符,包括空格,製表符 tab 換行符,中文全形空格等 w 字母或數字或下劃線或漢字等 匹配字串的開始 匹配字串的結束 轉義符 除換行符以外的任意字...