正規表示式要點總結
正規表示式(Regular Expression)是強大、便捷、高效的文字處理工具。
正規表示式的元字元與其他字元結合起來,實現我們期望的功能。
典型元字元:
^ 脫字元,一行的起始,匹配的是行開始的位置
$ 美元符,一行的結束,匹配的是行結尾的位置
| 豎線、管道,多選結構,匹配分隔兩邊的任意子表示式
(…) 括號,限制豎線(管道)的作用範圍,單用grep不支援,需用grep -E或egrep
[…] 字元組,匹配裡面的若干字元之一(正規表示式結構體Construct[],列出在某處期望匹配的字元)
[^…] 排除型字元組,匹配未列出的任意字元
- 連字元,表示一個範圍,用於字元組內部時才是元字元
. 點號,單個任意字元,用來匹配任意字元的字元組的簡便寫法
\< 反斜線小於,單詞分界符\<用於匹配單詞(字元組合,字母數字符號)開頭的位置
\> 反斜線大於,單詞分界符\>用於匹配單詞(字元組合,字母數字符號)結束的位置
同一字元在不同位置,含義可能不一樣,需注意區分。加引數-i表示匹配時不區分大小寫。
例項分析:
cat 尋找一行文字中任意位置的cat,如cat、catalog、scat、scatter
^cat 尋找行首的cat,如catalog
cat$ 尋找行尾的cat,如scat
^cat$ 只包含cat的行
^$ 空行,沒有任何字元(包括空白字元)
^ 單獨使用無意義
\<cat\> 匹配單詞cat
^(From|Subject): 表示尋找以From:或者Subject:開頭的行
包含型字元組:
[123456] 匹配1到6中的任意一個數字
<H[123456]> 匹配<H1>~<H6>,可以寫成<H[1-6]>,-為連字元,用於字元組內部時,表示一個範圍。
[0-9] 匹配一個數字
[a-z] 匹配一個小寫字母
[A-Z] 匹配一個大寫字母
[0-9A-Z_!.?] 匹配一個數字、大寫字母、下劃線、驚歎號、點或問號
[0123456789abcdefABCDEF] 可以寫成[0-9a-fA-F]或者[A-Fa-f0-9],順序無所謂,適合處理16進位制數字
[abc]、[a-c]、(a|b|c)表示同一個意思,但不是所有字元都可以這樣表示。字元組效率相對較高。
排除型字元組:
[^…] 匹配任何未列出的字元,字元組內部開頭的^表示排除(negate),列出不希望匹配的字元
n[^d] 匹配n後面不是字元d的行
[^d] 匹配不是僅包含字母d的行,即排除僅包含字母d的行
排除型字元組表示“匹配未列出的字元(match a character that’s not listed)”,而不是“不要匹配列出的字元(don’t match what is listed)”。
匹配檔案目錄/路徑的方法:
./([^/]+)/ 匹配./後面不是隻有/但可以是其他字元(出現次數不限)的行,最後面還有/
實測發現此正規表示式還不夠嚴謹
因為.是匹配單個任意字元(不一定是. 還可能是字母或其它字元)
若要匹配單獨的. 需要加轉義符\或者脫字元^
例項:[root@CentOS6 shell]# grep -E '\./([^/]+)/' dir.txt #加轉義符\
./home/
./...yes../
./new/
./100/
./中國/
./2015/
./2014-12-31/
[root@CentOS6 shell]# grep -E '^./([^/]+)/$' dir.txt #加行首行尾錨定符^和$
./home/
./...yes../
./new/
./100/
./中國/
./2015/
./2014-12-31/
[root@CentOS6 shell]# cat dir.txt
//
.//
./home/
./...yes../
.//~/
./new/
./100/
./中國/
./2015/
./2014-12-31/
/hometown/
yesterday
@China
.///
.////
.//~/~/
abcd//~/
..//../
[root@CentOS6 shell]#用點號.匹配任意字元:
元字元.(也稱點號dot、小點point)是用來匹配任意字元的字元組的簡便寫法。
如果需要在表示式中使用一個“匹配任意字元”的佔位符(placeholder),用點號.就很方便。
例如:
要搜尋03/19/76、03-19-76、03-19-76,表示式可以寫成字元組形式:03[-./]19[-./]76
也可以使用點號.替代字元組:03.19.76
相對而言,03[-./]19[-./]76更精確,03.19.76裡的點號.匹配到還可能是其他字元。具體用哪個取決於目標文字的情況。
字元組內的點號.不是元字元,僅代表普通的點字元;
在字元組內的連字元-,是否表示範圍要看其所在位置,在開頭或結尾都不是表示範圍,在中間(且不是在[^後面)的才是。例如:[.-/]中-是表示範圍,但[^-/.]、[./-]裡的-都不是表示範圍。
管道|多選結構:匹配任意子表示式
|也是一個元字元,意為或(or),透過它可以把不同的子表示式組合成一個總的表示式,在這樣的組合中,子表示式稱為“多選分支(alternative)”。
如:gr[ea]y 可以採用|寫成grey|gray,或者gr(a|e)y。
注意不要寫成gr[a|e]y,這裡面的|只是普通的字元,因為在字元組內部。
多選結構可以包括很多字元,但不能超越括號的界限。
一個字元組只能匹配目標文字中的單個字元,而每個多選結構自身都可能是完整的正規表示式,都可以匹配任意長度的文字。
(first|1st)與(fir|1)st 同一意思
(First|1st) [Ss]treet與(Fir|1)st [Ss]treet 同一意思
在一個包含多選結構的表示式中使用脫字元^和美元符$的時候要小心。
分析:
^From|Subject|Date: 匹配^From或Subject或Date:
^(From|Subject|Date): 匹配^From:或^Subjec:或^Date: 常用於提取E-mail檔案中的資訊
兩者的匹配結果是不一樣的。
如果希望在每個多選分支之前都有脫字元^,之後都有:,需要使用括號來限制(constrain)這些多選分支。
典型用法:
grep -E 'From:|Subject:' test.txt
grep -E '^(From|Subject|Date):' test.txt //單引號、雙引號都可以,擴充套件正則
egrep '^(From|Subject|Date):' test.txt
元字元序列\<和\> 單詞分界符:
使用正規表示式時經常會遇到一個問題,就是期望匹配的“單詞”包含在另一個單詞之中。
單詞分界符\<和\>用於匹配單詞開頭和結束的位置。注意:<和>本身並不是元字元,只有當它們與斜線\結合起來的時候,整個序列才有特殊意義(稱為元字元序列)。不是所有的egrep版本都支援單詞分界符。
分析:
\<cat\>意為匹配單詞的開頭位置,然後是c a t這3個字母,之後是單詞的結束位置,簡單的說就是匹配cat這個單詞。
也可以用\<cat和cat\>來分別匹配以單詞(或者說字母組合)cat開頭和結束的單詞。
egrep(相當於grep -E)認定的單詞開頭位置用向上的箭頭標識,單詞結束位置用向下的箭頭標識。
“單詞的開始和結束”準確地說是“字母數字字元號的開始和結束”。
可選項元素、萬用字元Wildcards:
optional items可選項元素
問號? 代表可選項,表示任意單個字元,把它加在一個字元的後面,就表示此處容許出現這個字元,不過它的出現並非匹配成功的必要條件。哪個字元可選,?就放在哪個字元後面。需要使用egrep或grep -E。
color、colour 可以透過colou?r來匹配
July、Jul 可以透過July?或(July|Jul)來匹配
fourth|4th|4 可以透過fourth|4(th)?來匹配 巢狀了括號,問號?作用的物件是整個括號內的內容。
括號及反向引用
括號的用途:
1、限制多選項的範圍
2、將若干字元組合為一個單元,受問號?或星號*之類量詞的作用,如four(th)?、(a)*
3、反向引用backreference 容許匹配與表示式先前部分匹配的同樣的文字
例如:\<([A-Za-z]+).+\1\> 這裡的括號()和\1用於支援反向引用
在支援反向引用的工具軟體中,括號()能夠“記憶”其中的子表示式匹配的文字,不論這些文字是什麼,元字元序列\1都能記住它們。而且,在一個表示式中可以使用多個括號,在用\1、\2、\3等來表示第一、第二、第三組括號匹配的文字。括號是按照開括號“(”從左至右的出現順序進行的。
例如:([a-z])([0-9])\1\2中的\1代表[a-z]匹配的內容,\2代表[0-9]匹配的內容。
轉義
.本身是元字元,它可以匹配任何字元,包括空格。
真正匹配文字中點號.的元序列應該是反斜線(backslash)加上點號的組合:
aga\.att\.com
\.稱為“轉義的點號”或“轉義的句號”,這種方法適用於所有的元字元,但在字元組內部無效。
這樣使用的反斜線成為“轉義符(escape)”——它作用的元字元會失去特殊含義,成為普通字元。
還可以用\([a-zA-Z]+\)來匹配一個括號內的單詞,例如(very),在開閉括號之前的反斜線消除了開閉括號的特殊意義,於是能夠匹配文字中的開閉括號。
許多程式設計語言都有識別符號(identifier,例如變數名)的概念。
識別符號只包含字母、數字以及下劃線,但不能以數字開頭。
可以用[a-zA-Z_][a-zA-Z_0-9]*來匹配識別符號:
第一個字元組匹配可能出現的第一個字元;
第二個(包括對應的*)匹配餘下的字元。
引號內的字串:
匹配引號內的字串,最簡單的方法是使用表示式:”[^”]*”
兩端的引號用來匹配字串開頭和結尾的引號。
在這兩個引號之間的文字可以包括雙引號之外的任何字元。
這裡用[^”]來匹配除雙引號”之外的任何字元,用*來表示兩個引號之間可以存在任意數目的非雙引號字元。
美元金額(可能包含小數):
\$[0-9]+(\.[0-9][0-9])?是一種匹配美元金額的辦法。
三個部分:\$、…+、(…)?
分別匹配一個美元符號、小數點前的數字(一個或一組數字)、小數點及其之後的數字(一個小數點和兩位數字),可以匹配$100.1之類的美元金額,但不能匹配$1,100這樣的金額,小數部分是可選的。
如果要匹配的是隻包含價格而不含其他字元的行,可以在此表示式兩端加上^…$,即:
^\$[0-9]+(\.[0-9][0-9])?$ 開頭為美元符$,結尾為數字,且必須包含小數點,匹配結果與前者不同
這個表示式不能匹配$.49。
因為:
^ 脫字元,一行的起始,匹配的是行開始的位置
$ 美元符,一行的結束,匹配的是行結尾的位置
網址HTTP/HTML URL:
網址(Web URL)的形式可能有很多種,所以構造一個能夠匹配所以形式的URL的正規表示式很有難度。
但如果只要求匹配大多數常見的URL,則相對比較簡單。
常見的HTTP/HTML URL樣式如下:
(或htm)
主機名(hostname)(如)的規則比較複雜,但因為主機名一般跟在http://之後,可以寫成:
[-a-z0-9_.]+ (可能應該是[-a-z0-9_.:]+)
path部分的變換更多,需要寫成:
[-a-z0-9_:@&?=+,.!/~*%$]*
注意:用作普通字元的連字元-必須放在字元組的開頭,用在字元組中間的是表示範圍的元字元。
綜合起來就是:
egrep -i ‘\<http://[-a-z0-9_.:]+/[-a-z0-9_:@&?=+,.!/~*%$]*\.html?\>' files
更簡化的版本:
egrep -i ‘\<http://[^ ]*\.html?\>' files
可能匹配出一些錯誤結果,根據具體需求調整表示式即可。
參考:
1、《[精通正規表示式(第三版)].(美)佛瑞德.掃描版.pdf》
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29734436/viewspace-2141300/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 正規表示式總結
- Java正規表示式總結Java
- 常用正規表示式總結
- JS正規表示式總結JS
- javascript正規表示式總結JavaScript
- 正規表示式學習總結
- JavaScript正規表示式方法總結JavaScript
- 正規表示式的小總結
- php之正規表示式函式總結PHP函式
- 超簡單!正規表示式總結
- 擴充正規表示式命令總結
- 正規表示式基礎知識總結
- 硬剛正規表示式的心得總結
- JavaScript學習總結(八)正規表示式JavaScript
- 正規表示式的\b與\B總結
- 『不再迷茫 – 正規表示式』JS正則要點梳理 持續更新JS
- c# 中常用的正規表示式總結C#
- 正規表示式的多種實用總結
- 正規表示式 點(.)元字元字元
- 正規表示式知識點
- 密碼強度的正規表示式(JavaScript)總結密碼JavaScript
- 正規表示式
- 正規表示式匹配標點符號符號
- 正規表示式中 “$” 並不是表示 “字串結束字串
- 【正規表示式】常用的正規表示式(數字,漢字,字串,金額等的正規表示式)字串
- 【JavaScript】正規表示式JavaScript
- php –正規表示式PHP
- 正規表示式 教程
- 正規表示式 split()
- java正規表示式Java
- PHP正規表示式PHP
- javascript正規表示式JavaScript
- 【java】正規表示式Java
- 初探正規表示式
- [js]正規表示式JS
- js正規表示式JS
- javascript–正規表示式JavaScript
- ORACLE 正規表示式Oracle