什么是正則表達式?正則表達式是用於描述字符排列和匹配模式的一種語法規則。在很多程序設計語言中都支持利用正則表達式來進行字符串的操作,不同語言中的正則表達式略有不同,但是畢竟都是正則,其本質思想都是一致的,當我們掌握了shell中的正則后,再去看python或者perl里面的正則表達式時,會發現其實都是一樣的東東。
在shell的一些命令中,有些並不支持正則表達式,但是它們支持Linux里面的通配符,那么通配符又是什么東東呢,它跟正則表達式又有什么關系?
正則表達式用來在文件中匹配符合條件的字符串,正則是包含匹配。grep、awk、sed等命令都支持正則表達式。通配符用來匹配符合條件的文件名,通配符是完全匹配。ls、find、cp這些命令不支持正則表達式,所以只能使用shell自己的通配符來進行匹配了。
通配符主要是下面三個:
* | 匹配任意字符 |
? | 匹配任意一個內容 |
[] | 匹配中括號中的一個字符 |
首先,正則表達式是用來匹配文件中文本的字符串,而通配符是用來匹配符合條件的文件名;其次正則表達式是包含匹配,只要包含正則中的字符串,就匹配,而通配符是完全匹配,也就是說,必須要與條件中的字符串一模一樣才會匹配。
說了這么多,其實正則表達式主要用於字符串的模式分割、匹配、查找及替換操作,下面來關注一下正則表達式基本的元字符和它的作用。
元字符 | 作用 | 舉例說明 |
* | 前一個字符匹配0次或者任意多次 | "a*" 匹配所有內容,包括空白行 "aa*" 匹配至少包含一個a的行 "aaa*" 匹配最后包含兩個連續a的字符串 "aaaaa*"匹配最少包含4個連續a的字符串 |
. | 匹配除了換行符外的任意一個字符 | "s..d" 匹配在s和d這兩個字母之間一定有兩個 字符的單詞 |
^ | 匹配行首 | "^hello" 匹配以hello開頭的行 "^M" 匹配以大寫“M”開頭的行 |
$ | 匹配行尾 | "hello$" 匹配以hello結尾的行 "n$" 匹配以小寫“n”結尾的行 "^$" 匹配空白行 |
[] | 匹配中括號中指定的任意一個字符,只匹配一 個字符 |
"[aeiou]" 匹配任意一個元音字母, 兩位字符。 "[0-9]" 匹配任意一個數字 "^[a-z]" 匹配小寫字母開頭的行 |
[^] | 匹配中括號的字符以外的任意一個字符 | "[^0-9]" 匹配任意一位非數字字符, "[^a-z]" 表示任意一位非小寫字母 "^[^a-z]" 匹配不是小寫字母開頭的行 "^[^a-zA-Z]" 匹配不是字母開頭的行 |
\ | 轉義符。用於將特殊符號的含義取消 | "\.$" 匹配使用"."結尾的行 |
\{n\} | 表示其前面的字符恰好出現n次 | "[0-9]\{4\}" 匹配4位數字, "[1][3-8][0-9]\{9\}" 匹配手機號碼 "a\{3\}" 匹配a字母連續出現3次的字符串 "[0-9]\{3\}" 匹配包含連續的3個數字的字符串 |
\{n,\} | 表示其前面的字符出現不小於n次 | "[0-9]\{2,\}" 表示兩位及以上的數字。 的字符串 |
\{n,m\} | 表示其前面的字符至少出現n次,最多出現 m次 |
"[a-z]\{6,8\}" 匹配6到8位的小寫字母。 最多三個a |
下面舉幾個個簡單的列子:
(1)匹配日期格式YYYY-MM-DD "[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}"
(2)匹配IP地址XXX.XXX.XXX "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}"
(3)匹配騰訊QQ號碼 "[1-9][0-9]\{4,9\}"