正則表達式,又稱規則表達式。正則表達式的英語為:Regular Expression,常簡寫為regex、regexp或RE,是計算機科學中的一個概念。正則表達式是一種用來匹配字符串的強有力的武器。它的設計思想是用一種描述性的語言來給字符串定義一個規則,凡是符合規則的字符串,我們就認為它“匹配”了,否則,該字符串就是不合法的。在很多文本編輯器裡,正則表達式通常被用來檢索、替換那些符合某個模式的文本,許多計算機程序設計語言也都支持利用正則表達式進行字符串操作。正則表達式用于字符串處理、表單驗證等場合,實用高效,所以我們很有必要去掌握它,本文梳理一些工作中常用的正則表達式,以備不時之需。
本文通過Linux系統中的grep命令來學習正則表達式,當grep與正則結合在一起時,grep就會根據正則表達式的含義在文本中查找出符合條件的字符串。
位置匹配測試文件1内容如下:
# cat reg1
hello everyone
I am laoliang
Linux hello
Linux
I likeLinuxverymuch!
”^”表示錨定行首,匹配輸入字符串的開始位置。比如”^hello”表示隻匹配位于行首的hello字符串。
“$”表示錨定行尾,匹配輸入字符串的結尾位置。比如”hello$”表示隻匹配位于行尾的hello字符串。
”^”與”$”分别代表錨定行首與錨定行尾,那麼,我們将它們結合在一起使用,”^Linux$”表示Linux既位于行首,同時也位于行尾,換句話說,就是整行中隻有一個單詞Linux。
那麼”^$”表示什麼意思呢?”^$”就表示行首與行尾相連,換句話說就是空行。”-n”參數可以顯示行号,可以看到第5行空行被匹配到了。
“\<”表示錨定詞首。”\<lao”表示以lao作為詞首的單詞将會被匹配到。
”\>”表示錨定詞尾。”liang\>”表示以liang作為詞尾的單詞将會被匹配到。
同理,我們也可以将”\<“與”\>”結合在一起使用,”\<am\>”表示當am既是詞首又是詞尾時則會被匹配到,換句話說,就是當am作為一個獨立的單詞時,則會被匹配到。
正則表達式中,除了”\<“與”\>”能夠表示錨定詞首與錨定詞尾以外,我們還可以使用”\b”去代替”\<“和”\>”,”\b”既能錨定詞首,也能錨定詞尾,示例如下:
“\B”則與”\b”正好相反,”\B”是用來匹配非單詞邊界的,如下”\BLinux”表示隻要Linux不是詞首就會被匹配到,同理”Linux\B”表示隻要Linux不是詞尾就會被匹配到。
次數匹配
測試文件2内容如下:
# cat reg2
a a
a aa
aaa
aaaaabbb
ab abc abcc
eaf bf eccf
ef eef eeefffff
“\{n\}” 表示前面的字符連續出現n次,将會被匹配到。比如”a\{2\}”表示a連續出現兩次就會被匹到。
“\{x,y\}”表示之前的字符連續出現的次數在x與y之間,将會被匹配到。比如”a\{2,4\}”表示連續出現2次,3次,4次a字母将會被匹配。
“*”表示之前的字符連續出現任意次數(包括0次),将會被匹配到。比如”e*f”表示ef中間e出現任意次将會匹配。
”.”表示匹配任意單個字符。比如”ee..”表示ee後面跟随任意兩個字符都會被匹配到,”空格”也算作單個字符所以也會被匹配。
”.*”可以理解為”.”與”*”的結合,表示連續出現任意次的任意單個字符,換句話說就是匹配任意長度的任意字符。比如”a.*”表示a字母後面存在任意長度的任意字符都可以被匹配到。
“\?”表示匹配其前面的字符0或1次,也就是前面的字符要麼沒有要麼有一個。比如”abc\?”表示ab後面c出現0次或者1次都會被匹配到。
“\ ”表示匹配其前面的字符至少1次,也就是前面的字符必須有至少一個。比如”abc\ ”表示ab後面c至少要出現1次才會被匹配到。
字符匹配
測試文件3内容如下:
# cat reg3
a
a123
a123b
a123$
a123bc456
abcdefg
aBdCeFg
aBCD
a1a3
a#@!
“[[:alpha:]]” 表示匹配任意字母(不區分大小寫)。比如"a[[:alpha:]]\{3\}"表示隻有a字母後面跟随了3個字母的字符串才會被匹配到。還有一種方式”[a-zA-Z]”也能表示任意字母。
“[[:lower:]]”表示匹配任意小寫字母。比如"a[[:lower:]]\{3\}"表示隻有當a後面的3個字符均為小寫字母時,才會被匹配到。還有一種方式”[a-z]”也能表示任意一個小寫字母。
“[[:upper:]]”表示匹配任意大寫字母。比如"a[[:upper:]]\{3\}"表示隻有當a後面的3個字符均為小寫字母時,才會被匹配到。還有一種方式”[A-Z]”也能表示任意一個大寫字母。
“[[:digit:]]” 表示匹配任意數字。比如"a[[:digit:]]\{3\}"表示隻有當a後面的3個字符均為數字時,才會被匹配到。還有一種方式”[0-9]”也能表示任意一個數字。
“[[:alnum:]]” 表示匹配任意數字或字母。比如"a[[:alnum:]]\{3\}"表示當a後面的3個字符為數字或字母時會被匹配到。還有一種方式”[a-zA-Z0-9]”與之等效。
我們可以把上面[[:alpha:]]等拆成兩部分理解:
“[ ]”就表示匹配指定範圍内的任意單個字符的意思。比如"a[bB#3]"表示a後面是b或B或#或3都可以匹配到。
“[^ ]”表示匹配指定範圍外的任意單個字符,它與”[ ]”的含義正好相反。比如“[^0-9]”表示匹配單個非數字字符,與[0-9]的含義這正好相反。
轉義符
測試文件4内容如下:
# cat reg4
abc
a!@#
a...bc
a*bc
“\”與正則中的符号結合在一起時,就表示這個符号本身的含義。比如”.”在正則表達式中代表任意單個字符,如果我們需要匹配字母a後面兩個.就需要用到轉義符”\”。
案例
我們需要從ifconfig命令的結果中找出IPv4格式的IP地址,正則表達式可以如下進行編寫:
\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}
這裡可以分為三部分進行理解:
這樣我們就匹配出來了IP地址。
以上就是關于正則表達式的介紹了,相信在工作中你一定會用到它!
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!