正規表示式是對
字串操作的一種邏輯公式,就是用事先定義好的一些特定字元、及這些特定字元的組合,組成乙個「規則字串」,這個「規則字串」用來表達對字串的一種過濾邏輯。
給定乙個正規表示式和另乙個字串,我們可以達到如下的目的:
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 字母或數字或下劃線或漢字等 匹配字串的開始 匹配字串的結束 轉義符 除換行符以外的任意字...