正則表達式的文法分為3種標准:BRE、ERE 和 ARE。其中 BER 和 ERE 屬於 POSIX 標准,ARE 則是由各家定義的擴展
BRE:基本正則表達式
ERE:在BRE基礎上,擴展正則表達式
什么是POSIX呢,POSIX Portable Operating System Interface 可移植操作系統接口, (BRE, ERE)的應用。
正則表達式的基本字符匹配:特殊字符(meta character 元字符)和一般字符。
什么是元字符:特殊意義的專用字符(如"*","+","?","."等),用一個或者一組元字符代替一個或多個字符。舉個例子: 元字符*用來匹配0個或多個的前一字符;而元字符. 用來匹配一個任意的一個字符
什么是一般字符:原義正常文本字符(非元字符),例如:'*grep' 匹配所有一個或多個任意字符后緊跟grep,grep就是一般字符。
|
grep |
sed |
vi |
egrep |
awk |
BRE |
* |
* |
* |
|
|
ERE |
|
|
|
* |
* |
字符 |
BRE/ERE |
模式含義 |
^ |
BRE,ERE |
行或字符串的開始;如:'^abcd' 匹配所有以abcd開頭的行 |
$ |
BRE,ERE |
行或字符串的結束,如:'abcd$' 匹配以abcd結尾的行 |
. |
BRE,ERE |
匹配一個非換行符的字符 (1); 如:'a.b' 匹配a后接一個任意字符,然后是b,將匹配 aAb, a1b, acb, a@b等
如: '.b' 匹配 ab,1b,@b …等 |
* |
BRE,ERE |
匹配零個或多個正則表達式前面的字符 (0-n) 如:'ac*d' 匹配a后接零個或多個前面的字符,將匹配:ad, acd, accd, acccd …等
注意:星號不能放在首位, 星號前面必須有單個字符,經常我們使用 .*表示任意數目字符,但不能直接把星號放在首位如 '*d' |
[…] |
BRE,ERE |
匹配方括號內任意一個字符(1); 如:"[Ab]cde" 匹配Abcd和abcd
如:"[0-9]abc"匹配abc前面的任意一個數字:0abc, 1abc, 2abc, 012abcd, 0123abcd ……
[a-z] 123 匹配123前面的任意一個小寫母如:a123, b123, ab123, abc123 [A-Z] 123 匹配123前面的任意一個大寫母如:A123, B123, AB123, ABC123 [a-zA-Z0-9]表示匹配任意一個數字和大小寫英文字母; [a-bA-Z0-9!]表示所有的大小寫字母,數字和感嘆號; 其它的形式有:[A-Z],[AB-Z],[A-YZ],[AB-YZ],[A-DE-Z] 不支持形式有:[A-D-Z],[AB-D-Z],[A-D-YZ]
如果^符號位於方括號的開始,則具有相反含義:不匹配方括號中的任意字符。 如:'[^A-FH-Z]rep' 匹配不包含A-R和T-Z的一個字母開頭,緊跟rep的行;或者[^A-Z]rep
|
\ |
BRE,ERE |
通常用於關閉其后續字符的特殊意義,恢復其原意。 如:\(...\),這里的括號僅僅表示括號。 |
4. BRE 和ERE支持不同的元字符
字符 |
BRE |
模式含義 |
\(\) |
BRE |
將圓括號之間的模式存儲在特殊“保留空間”。最多可以將9個獨立的子模式存儲在單個模式中。匹配於子模式的文本,可以通過轉義序列\1到\9,被重復使用在相同模式里。
如'\(abc\).*\1' 匹配兩個abc中間帶有任意數目的字符,第二個abc使用\1來引用。最多可以保存9個獨立的模式,即從\1到\9; 簡單說:將abc放在保留空間,使用\1引用abc; 注意:必須使用 .*
\(ab\).*\1 匹配: abab,ab1ab1, ab12ab1, ab123ab1….等 \(ab\).*\1.*\(de\).*\2 匹配ab1ab1def1de1, ab12ab12de12de1….等 |
\n |
BRE |
重復在\內的第n個模式。n為1到9,n是數字. |
x\{m, n\} |
BRE |
匹配x字符出現的次數區間。x\{n\}是指x出現n次;x\{m,\}是指x出現至少m次;x\{m,n\}指x至少出現m次,至多出現n次.
如:ab\{2\}匹配abb;ab\{2,\}表示abb、abbb等。ab\{2,4\}表示abb、abbb和abbbb。 |
x{m, n} |
ERE |
其功能等同於上面的\{n,m\},只是不再寫\轉義符了。 匹配x字符出現的次數區間。x\{n\}是指x出現n次;x\{m,\}是指x出現至少m次;x\{m,n\}指x至少出現m次,至多出現n次.
m表示最小值,n表示最大值 如:ab{2}匹配abb;ab{2,}表示abb、abbb等。ab{2,4}表示abb、abbb和abbbb。 |
+ |
ERE |
與*相比,匹配前面正則表達式的一個或多個實例 (1-n)
如:ab+c 匹配abc,abbc,abbbc ….等 |
? |
ERE |
匹配前面正則表達式的零個或一個實例 (0-1) 如:ab?c 匹配ac, abc |
| |
ERE |
匹配|前面或后面的正則表達式 如:'ab|cd'匹配ab, cd, abcd |
() |
ERE |
匹配用括號括起來的正則表達式群; 如:參見11的分組例子 |
字符 |
模式含義 |
\< |
單詞的開始,如:'\<ab' 匹配包含以ab開頭的單詞的行 |
\> |
單詞的結束,如:'ab\>'匹配包含以ab結尾的單詞的行
如:匹配單詞開頭+word+結尾 test@sha> echo this is a word. |grep '\<word\>' this is a word. |
\w |
匹配文字和數字字符,也就是[A-Za-z0-9] 如:'G\w*p' 匹配以G后跟零個或多個文字或數字字符,然后是P ;'G\w*p' 匹配 G123456abp |
\W |
\w的反置形式,匹配一個或多個非單詞字符,如點號,句號等 如:'G\W*p' 匹配G...:p |
\b |
單詞鎖定符 如:'\bhello\b'只匹配hello 如:''er\b'' 可以匹配"never" 中的''er'',但不能匹配 "verb"中的 ''er''。 awk使用\y表示此功能 |
\B |
正則表達式之后或者之前不能是空格
如: ''er\B''能匹配"verb"中的''er'',但不能匹配"never"中的 ''er'' (er是結束位置,不能匹配) |
\`\` |
分別匹配緩沖區的開頭和結尾。通常視為^和$同義 |
實例:
test@sha>cat aa.regular
aatestaa
west123es123
test@sha>cat bb.regular
bbtestbb
test@sha>cat cc.regular
cctestcc
test@sha>ls -l |grep '\<aa' #列出以aa開頭的文件
test@sha>grep 'test' c* #顯示以c開頭的文件中包含test的行
Cctestcc
test@sha>grep 'test' a* b* c* #顯示以a,b,c開頭的文件中包含的test的行
aa.regular:aatestaa
bb.regular:bbtestbb
cc.regular:cctestcc
test@sha>grep '[a-z]\{5\}' a* #顯示以a開頭的文件中,至少有5個連續小寫字母的字符串的行
aatestaa
test@sha>grep 'w\(es\)t.*\1' a* #顯示以a開頭的文件中,包含west並且重復出現過一次es
west123es123
6.1 POSIX 字符集
|
模式含義 |
[::alnum] |
匹配文本和數字字符,等效於A-Za-z0-9 如:ab[[::alnum]] 匹配abc,ab1 |
[:alpha:] |
匹配文字字符; 如:ab[[:alpha:]] 匹配abc |
[:blank:] |
匹配空格space與定位tab字符 |
[:cntrl:] |
匹配控制字符 |
[:digit:] |
匹配數字字符 |
[:graph:] |
匹配非空格字符 |
[:lower:] |
匹配小寫字母字符 |
[:print:] |
匹配非空字符(包括空格) |
[:punct:] |
匹配標點符號字符 |
[:space:] |
匹配空格字符 (新行,空格,制表符) |
[:upper:] |
匹配大寫字母字符 |
[:xdigit:] |
匹配16進制數字 |
實例:#匹配一個或多個數字字符或下划線"_"
test@sha>echo this num is 123_456 |grep -E '[[:digit:]_]+'
this num is123_456
test@sha>echo this num is 123456 |grep -E '[[:digit:]_]+'
this num is123456
test@sha>echo this num is _ |grep -E '[[:digit:]_]+'
this num is _
- 此外,還有以下特殊字符類:
perl類 等效POSIX表達式 描述
----------------------------------------------------------------------------
\o [0-7] |
八進制數字 |
\O [^0-7] |
非八進制數字 |
\w [[:alnum:]_] |
單詞構成字符 |
\W [^[:alnum:]_] |
非單詞構成字符 |
\A [^[:alpha:]] |
非字母 |
\L [^[:lower:]] |
非小寫字母 |
\U [^[:upper:]] |
非大寫字母 |
\S [^[:space:]] |
非空格符 |
\D [^[:digit:]] |
非數字 |
\X [^[:xdigit:]] |
非十六進制數字 |
\P [^[:print:]] |
非可打印字符 |
- 還可以使用以下特殊字符換碼序列:
\r |
回車 |
\n |
換行 |
\b |
退格 |
\t |
制表符 |
\v |
垂直制表符 |
\" |
雙引號 |
\' |
單引號 |
6.2 排序符號
多個字符序列視為一個元素,它使用[.和.]將字符組合括起來。例如,[.cn.]就表示cn字符序列,而單獨的c或n都不行
6.3 等價字符集
等價字符集表示應視為等值的一族字符,使用[=和=]將字符括起來。例如,e和ê,在法語的local 里,"[[=e=]]" 可能匹配於e/é/è/ê
7.1 一般字符
7.2 轉移meta字符
例如:\.就真表示一個點;\[左方括號;\\表示反斜杠
7.3 . (點號)字符
".hina"表示"任一字符";很少單獨使用,多與其他字符混合匹配多個字符
7.4 方括號表達式
例如:
[cC]hina匹配china 和China;
[^abd]hina匹配除了abd 3個小字母外的任意字母,加上hina.(包括:所有大寫字母,數字,標點符號等)
[a-zA-Z0-9]hina, 匹配[a-z],[A-Z],[0-9]加上hina
8.1 星號字符的應用
8.2 區間表達式的應用
8.3 匹配多個字符實例
+字符的概念和*有點相似,但是+字符要求前置正則表達式至少出現一次
實例:
字符串: abcxxxABCabcxxxefg
^abc 匹配字符串開頭的3個字母abc, 例如 abcxxxABCabcxxxefg
^ABC 匹配字符串開頭的ABC
efg$ 匹配結尾處的efg ,$表示結尾,即abcxxxABCabcxxxefg
^$ 匹配空的字符串或者空行
BRE運算優先級
運算符 |
含義 |
[..] [==][::] |
方括號符號 |
\meta |
轉義的meta字符 |
[] |
方括號表達式 |
\(\)\n |
后向應用表達式 |
*\{\} |
區間表達式和星號表達式 |
無符號 |
連續 |
^$ |
錨點 |
運算符 |
含義 |
[..][==][::] |
方括號符號 |
\meta |
轉移的meta字符 |
[] |
方括號表達式 |
() |
分組 |
*+? {} |
重復前置的正則表達式 |
無符號 |
連續 |
^$ |
錨點 (匹配空行) |
| |
交替 |
11.更多差異 (后向引用,分組,交替)
11.1 后向引用 (BRE)
使用\(和\) 括起想要之后引用的部分,使用\1-\9引用之前選定的部分
例如: \(ab\)\(cd\)[efg]*\1\2
ab被括起來,之后使用\1引用;cd被括起來,之后使用\2引用;
[efg]* 表示:e或f或g,或空;
匹配的一些字符串是: abcdabcd, abcdeabcd, abcdfabcd, abcdgabcd
例如:\(go\).*\1
匹配的一些字符串是: gogo,go1go, go12go, go123go….等
11.2 交替 (ERE)
例如:you|me 匹配you 或者me
11.3 分組 (ERE)
匹配重復情況;如:(go)+匹配一個或者多個連續的go
例子:
man|woman+ 匹配字符串: man, woman, womann, womannn
(man|woman)+ 匹配字符串:man,woman, manman,womanwoman
參考書籍:linux shell 從入門到精通
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。