正則表達式
正則表達式是一種表示法,只要工具支持這種表示法,那麼該工具就可以用正則表達式處理字符,它是一類字符所書寫的模式,其中許多字符不表示其字面意思,而是表達控制或通配等功能,正則表達式的這種搜索能力是程序實現的。
元字符:不表示其字面意思,而用於額外功能性描述
正則表達式需要一個專門的處理程序(正則表達式處理程序)。這種機制可稱作正則表達式引擎。
正則表達式的字符串表示方式依照不同的嚴謹度可分爲:
基本正則表達式:支持的元字符少一點,功能少一點
擴展正則表達式:支持的元字符多一點,功能多一點
支持正則表達式的幾個常用工具:
grep,egrep
grep:
Globalsearch REgular expression and Printout the line.
grep是一個文本搜索工具,它能使用正則表達式搜素文本,grep命令在linux中是很有用的,它可以和管道(|)配合起來使用,很強大,可用於逐行搜索文本文件.如想要在幾個文本文件中查找一串字符串。‘grep’在文本中搜索並顯示與你指定所能匹配的字符串所在行默認情況下,grep只搜索當前目錄,當然要搜索次目錄下的子目錄,可通過選項-d(遞歸)來顯示。
基本正則表達式的元字符:
字符匹配:
.:匹配任意單個字符
比如,我們要找出/etc/passwd/下的所有以i開頭b結尾,且中間跟了任意2個字符的字符
[]:匹配指定範圍內的任意單個字符
[0-9]或[[:digit:]] :任意數字
[a-z]或[[:lower:]] :任意小寫字母
[A-Z]或[[:upper:]] :任意大寫字母
[[:space:]] :空白字符
[[:punct:]] :特殊字符(標點符號)
[[:alpha:]] :所有的大小寫字母
[[:alnum:]] :所用的數字和字面
[^]:取反
次數匹配元字符:用於實現指定其前面的字符所能夠出現的次數
*:任意長度,意思是*前面的字符可以出現任意次,包括0次
\?:0次或1次,它前面的字符是可有可無的
\{m\}:表示精確匹配次數,它前面的字符要出現m次
\{m,n\}:範圍表達方式.至少m次,至多n次.當然m要小於n.
\{m,\}:至少m次
\{0,n\}:至多n次
.*: 匹配任意長度的任意字符
這是因爲正則表達式默認情況下工作於貪婪模式。盡最大能力去匹配,能匹配多長就匹配多長。
位置錨定:
^:行首錨定:
寫在模式最左側
$:行尾錨定:
寫在模式最右側
^$:表示空白行
\<:詞首錨定,出現於單詞左側
\<char
\>:詞尾錨定,出現於單詞右側
char\>
\b:表示出現在詞首或詞尾都 可以
分組:
分組的目的是爲了實現將不止一個字符當做一個不可分割的原子單位來對待的。
分組中的模式匹配到的內容,可由正則表達式引擎記憶在內存中,後可被多次引用。只要形如(\)\的括號出現,不論引用與否,都已經被記錄下來
\(\)
例如:\(ab\)*:表示ab這個組可以出現任意次數
這裏的括號有特殊意義,所以要加\來轉義
引用:
例如:
\(ab\(x\)c\)\.*\(mn\) :表示在abc這個組\(abc\)中有個x \(x\),然後中間緊跟着任意長度的任意字符串.*。後面還有個mn組 \(mn\)
這裏的括號有編號:自左向後的左括號,以及與其匹配的右括號
\#:引用第n個括號所匹配到的內容,而不是模式本身
例如:
\(ab\?c\).*\1 這裏的 \1可以看着是一個變量名,每次輸入一串字符後都會保持下來,而且新的字符會把原來保存的覆蓋掉
命令選項:
-v:反向選取
-o:僅顯示匹配的字串,而非字串所在的行
-i:ignore-case,忽略字符大小寫
-E:支持使用擴展正則表達式
例:顯示/etc/rc.d/rc.sysinit文件中,以#開頭,後面跟至少一個空白字符,而後又有至少一個非空白字符的行;
找出netstat -tan命令執行結果中以'LISTEN'結尾的行;
這裏我們用管道把netstat –tan的結果送給grep
擴展正則表達式:egrep;grep-E也支持擴展正則表達式,此時相當於egrep.
字符匹配:
.
[]
[^]
次數匹配:
*:任意次
?:0次或1次
+:至少1次;
{m}:精確匹配m次
{m,n}:至少m次,至多n次
{m,}:最少m次
例如:顯示/proc/meminfo文件中以大寫或小寫S開頭的行;用egrep來實現