什么是正則表達式?正則表達式是用于描述字符排列和匹配模式的一種語法規則。在很多程序設計語言中都支持利用正則表達式來進行字符串的操作,不同語言中的正則表達式略有不同,但是畢竟都是正則,其本質思想都是一致的,當我們掌握了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這兩個字母之間一定有兩個 字符的單詞"s.*d"匹配在s和d字母之間有任意字符".*"匹配所有內容 |
^ | 匹配行首 | "^hello"匹配以hello開頭的行"^M"匹配以大寫“M”開頭的行 |
$ | 匹配行尾 | "hello$"匹配以hello結尾的行"n$"匹配以小寫“n”結尾的行"^$"匹配空白行 |
[] | 匹配中括號中指定的任意一個字符,只匹配一個字符 | "[aeiou]"匹配任意一個元音字母,"[0-9]"匹配任意一位數字,"[a-z][0-9]"匹配小寫字母和一位數字構成的 兩位字符。"s[ao]id"匹配s和i字母中,要么是a,要么是o "[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,/}"表示兩位及以上的數字。"[0-9]/{3,/}[a-z]"匹配最少用連續3個數字開頭 的字符串 |
/{n,m/} | 表示其前面的字符至少出現n次,最多出現m次 | "[a-z]/{6,8/}"匹配6到8位的小寫字母。"sa/{1,3/}i"匹配在字母s和i直接有最少一個a, 最多三個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/}"
新聞熱點
疑難解答