正則表達式入門
談到正則表達式,我們就得先了解一下POSIX。POSIX的全稱是Portable Operating System Interface for
uniX,它由一系列規范構成,定義了UNIX,linux操作系統應當支持的功能,它定義了BRE(Basic Regular Expression,基本型正則表達式)和ERE(Extended Regular Express,擴展型正則表達式)兩大流派。
正則表達式由只代表自身的字面值和代表特定含義的元字符組成,除非特別說明,正則表達式嚴格區分大小寫。正則表達式的大致匹配過程是:
1.依次拿出表達式和文本中的字符比較,
2.如果每一個字符都能匹配,則匹配成功;一旦有匹配不成功的字符則匹配失敗。
3.如果表達式中有量詞或邊界,遵循量詞或邊界指定的規則來匹配。
基礎正則表達式中,如果你想使用? + () {},因為他們表示特殊含義,所以你需要將他們轉義
而擴展正則表達式中,如果你想使用? + () {} ,就沒必要加“\”了,進化版的正則表達式在這方面給我們提供了很大的便利
所謂特殊含義,就是正則表達式中的含義。非特殊含義,就是這個符號本身。
+,和*中大家會遇到貪婪模式的說法,也有稱最長匹配原則,本質就是趨向于最大長度匹配。”.*”這個組合幾乎可以匹配所有,貪婪性赤裸裸的暴露出來了。
基本正則表達式(BRE)
字符匹配
(匹配的時候需要使用兩個方括號,如[[ :alpha:]]) . 表示任意單個字符,.會匹配除了換行符的任意字符 [ ] 表示匹配范圍內的任意單個字符 [^ ] 表示匹配范圍外的任意單個字符 [:alpha:] 任意一個字母(相當于a-zA-Z) [:upper:] 任意一個大寫字母(相當于A-Z) [:lower:] 任意一個小寫字母(相當于a-z) [:digit:] 任意一個數字(相當于0-9) [:space:] 水平和垂直的空白字符(比blank包含的更多) [:blank:] 空白字符(空格和制表符) [:punct:] 標點符號 [:alnum:] 任意字母和數字(相當于0-9a-zA-Z) [:print:] 可打印字符
匹配次數
* 表示*號前面的一個字符的0-N次(它有一個貪婪模式,會盡量匹配最長) .* 表示任意多個長度的字符 \? 表示\?符號前的字符0-1次 \+ 匹配\+前的字符至少1次 \{m,n\} 表示\{m,n\}符號前的字符的m-n次 \{m\} 表示{m\}符號前的字符m次 \{n,\} 表示匹配前面字符至少n次 \{,n} 表示匹配前面字符最多n次
位置錨定
^ 之后接字符 表示^ 之后的字符出現在行首 $ 之前接字符 表示$之前的字符出現在行尾 \> 表示\> 符號之后的字符出現在單詞的尾部 \< 表示\< 之前的字符出現在單詞的首部 \<字符 \> 表示只有小于號和大于號之間的字符
分組
分組 : \(\) 將一個或多個字符捆綁在一起,當作一個整體進行處理,如 : \(root\)+ 后向引用 : 引用前面的分組括號中的模式所匹配字符,而非模式本身 或者 : \|
拓展正則表達式(ERE)
字符匹配
. 表示任意單個字符,.會匹配除了換行符的任意字符 [] 匹配指定范圍內的任意單個字符 [^] 匹配指定范圍外的任意單個字符 [ :alnum : ] 字母和數字 [ :alpha : ] 代表任何英文大小寫字符,亦即 A-Z, a-z [ :lower : ] 小寫字母 [ :upper : ] 大寫字母 [ :blank : ] 空白字符(空格和制表符) [ :digit : ] 十進制數字 [ :xdigit : ] 十六進制數字 [ : graph :] 可打印的非空白字符 [ :print :] 可打印字符 [ :punct :] 標點符號
匹配次數
* 匹配前面字符任意次,包括0次 ? 0或1次 +: 1次或多次 {n} 匹配前面的字符n次 {m,n} 匹配前面的字符至少m次,至多n次 {,n} 匹配前面的字符至多n次 {n,} 匹配前面的字符至少n次
位置錨定
^ 行首錨定,用于模式的最左側 $ 行尾錨定,用于模式的最右側 \< 或 \b 詞首錨定,用于單詞模式的左側 \> 或 \b 詞尾錨定;用于單詞模式的右側 \<PATTERN\> 匹配整個單詞
分組
():分組,后面可以使用1 ,2 ,3...引用前面的分組 a|b : a或b
優先級
優先級 |
符號 |
1 |
\ |
2 |
( )、(?: )、(?= )、[ ] |
3 |
*、+、?、{n}、{n,}、{m,n} |
4 |
^、$ |
5 |
| |
實戰
(思考的出發點不同,過程也就不盡相同,過程和結果同樣重要)
1找出/etc/rc.d/init.d/functions的基名(basename可以直接獲?。?。
2 找出/etc/rc.d/init.d/functions的目錄名(dirname可以直接獲?。?。
3 統計last命令中以root用戶登錄的每個主機IP登錄次數。
4 顯示ifconfig命令中所有的IPV4地址。
5顯示/etc/passwd中以/bin/bash結尾的行。
基于最近的學習整理的資料,尚有諸多不足之處,還望大佬們多多指點!
原創文章,作者:LinuxWalker,如若轉載,請注明出處:http://www.www58058.com/83036