正規表示式

2021-06-21 01:51:35 字數 4080 閱讀 4799

正規表示式(regular expression):規定一些特殊語法表示字元類、數量限定符和位置關係,然後用這些特殊語法和普通字元一起表示乙個模式

例如:email位址的正規表示式可以寫成[a-za-z0-9_.-]+@[a-za-z0-9_.-]+\.[a-za-z0-9_.-]+

ip位址的正規表示式可以寫成[0-9]\.[0-9]\.[0-9]\.[0-9]

192.168.1.1

1234.234.04.5678

123.4234.045.678

abcde

$ egrep '[0-9]\.[0-9]\.[0-9]\.[0-9]' testfile

192.168.1.1

1234.234.04.5678

egrep相當於grep -e,表示採用extended正規表示式語法。grep的正規表示式有basic和extended兩種規範,它們之間的區別下一節再解釋。另外還有fgrep命令,相當於grep -f,表示只搜尋固定字串而不搜尋正規表示式模式,不會按正規表示式的語法解釋後面的引數。

注意正規表示式引數用單引號括起來了,因為正規表示式中用到的很多特殊字元在shell中也有特殊含義(例如\),只有用單引號括起來才能保證這些字元原封不動地傳給grep命令,而不會被shell解釋掉。

本節介紹egrep(1)所使用的正規表示式,它大致上符合posix正規表示式規範。

字元類字元

含義舉例

.匹配任意乙個字元

abc.可以匹配abcdabc9

匹配括號中的任意乙個字元

[abc]d可以匹配adbdcd

-括號內表示字元範圍

[0-9a-fa-f]可以匹配一位十六進製制數字

^位於括號內的開頭,匹配除括號中的字元之外的任意乙個字元

[^xy]匹配除xy之外的任一字元,因此[^xy]1可以匹配a1b1但不匹配x1y1

[[:***:]]grep工具預定義的一些命名字元類

[[:alpha:]]匹配乙個字母,[[:digit:]]匹配乙個數字

數量限定符字元

含義舉例

?緊跟在它前面的單元應匹配零次或一次

[0-9]?\.[0-9]匹配0.02.3.5等,由於.在正規表示式中是乙個特殊字元,所以需要用\轉義一下,取字面值

+緊跟在它前面的單元應匹配一次或多次

[a-za-z0-9_.-]+@[a-za-z0-9_.-]+\.[a-za-z0-9_.-]+匹配email位址

*緊跟在它前面的單元應匹配零次或多次

[0-9][0-9]*匹配至少一位數字,等價於[0-9]+[a-za-z_]+[a-za-z_0-9]*匹配c語言的識別符號

緊跟在它前面的單元應精確匹配n次[1-9][0-9]匹配從100999的整數

緊跟在它前面的單元應匹配至少n

[1-9][0-9]匹配三位以上(含三位)的整數

緊跟在它前面的單元應匹配最多m

[0-9]相當於[0-9]?

緊跟在它前面的單元應匹配至少n次,最多m

[0-9]\.[0-9]\.[0-9]\.[0-9]匹配ip位址

注意grep找的是包含某一模式的行,而不是完全匹配某一模式的行。再舉個例子,如果文字檔案的內容是

aaabc

aadefg

查詢a*這個模式的結果是三行都被找出來了

$ egrep 'a*' testfile 

aabc

aadefg

a*匹配0個或多個a,而第三行包含0個a,所以也包含了這一模式。單獨用a*這樣的正規表示式做查詢沒什麼意義,一般是把a*作為正規表示式的一部分來用。

位置限定符

字元含義

舉例^匹配行首的位置

^content匹配位於一行開頭的content

$匹配行末的位置

;$匹配位於一行結尾的;號,^$匹配空行

\<匹配單詞開頭的位置

\

\>匹配單詞結尾的位置

p\>匹配leap ...,但不匹配parentsleepy

\b匹配單詞開頭或結尾的位置

\bat\b匹配... at ...,但不匹配catatexitbatch

\b匹配非單詞開頭和結尾的位置

\bat\b匹配battery,但不匹配... attendhat ...

位置限定符可以幫助grep更準確地查詢,例如上一節我們用[0-9]\.[0-9]\.[0-9]\.[0-9]查詢ip位址,找到這兩行

192.168.1.1

1234.234.04.5678

如果用^[0-9]\.[0-9]\.[0-9]\.[0-9]$查詢,就可以把1234.234.04.5678這一行過濾掉了。

其它特殊字元

字元含義

舉例\轉義字元,普通字元轉義為特殊字元,特殊字元轉義為普通字元

普通字元<寫成\<表示單詞開頭的位置,特殊字元.寫成\.以及\寫成\\就當作普通字元來匹配

()將正規表示式的一部分括起來組成乙個單元,可以對整個單元使用數量限定符

([0-9]\.)[0-9]匹配ip位址

|連線兩個子表示式,表示或的關係

n(o|either)匹配noneither

正規表示式 正規表示式 總結

非負整數 d 正整數 0 9 1 9 0 9 非正整數 d 0 負整數 0 9 1 9 0 9 整數 d 非負浮點數 d d 正浮點數 0 9 0 9 1 9 0 9 0 9 1 9 0 9 0 9 0 9 1 9 0 9 非正浮點數 d d 0 0 負浮點數 正浮點數正則式 英文本串 a za z...

正規表示式 表示式

網域名稱 a za z0 9 a za z0 9 a za z0 9 a za z0 9 interneturl a za z s 或 http w w w 手機號碼 13 0 9 14 5 7 15 0 1 2 3 5 6 7 8 9 18 0 1 2 3 5 6 7 8 9 d 號碼 x x x...

Linux正規表示式 編寫正規表示式

為了所有實用化的用途,你可以通過使用程式產生正確的結果。然而,並不意味著程式總是如你所願的那樣正確地工作。多數情況下,如果程式不能產生想要的輸出,可以斷定真正的問題 排除輸入或語法錯誤 在於如何描述想要的東西。換句話說,應該考慮糾正問題的地方是描述想要的結果的表示式。表示式不完整或者公式表示得不正確...