基本正則表達式中支持分組,而在擴展正則表達式中,分組的功能更加強大,也可以說才是真正的分組,用法如下:
():分組,后面可以使用 \1 \2 \3... 引用前面的分組,除了方便后面引用外,分組還非常方便的可以使用上述次數(shù)匹配方法進行匹配具有相同條件的數(shù)據(jù)。
如:grep '^(barlow).*\1' /etc/passwd
搜索 /etc/passwd 中以 barlow
開頭,而后面還存在 barlow 的行。
在 BRE 中,我們使用一些 meta 字符修飾前置字符,匹配重復的情況。但是這樣的操作僅僅針對單個字符。在 ERE 中,分組功能能夠計 meta 字符修飾前置字符串。一個針對字符,一個針對字符串。
在 ERE 里,我么已經(jīng)提到運算符是被應(yīng)用到” 前置的正則表達式”。這是因為有圓方括號 ({...}) 提供分組功能,讓接下來的運算符可以應(yīng)用。例如
(why)+ 匹配于一個或連續(xù)重復的多個 why。再例如:[Tt]he (CPU|computer) is
指的是: 在 the(The) 與 is 之間,含有 CPU 或 computer 的句子。特別注意: 圓括號里的是 meta 字符,而非要匹配的輸入文本。由此看出用到交替的時候,分組特別有用。
例如 (read|write)+
指的是: 有一個或重現(xiàn)多個 read,或者一個或重現(xiàn)多個 write.(read|write)+
所指的字符串中間,不允許有空白。當將交替操作結(jié)合 ^ 與 $ 錨點字符使用時,分組就非常好用了。由于 | 為所有運算符中優(yōu)先級最低的,因此正則表達式 ^abcd|efgh$
意思是” 匹配字符串的起始處是否具有 a b c d 或者字符串結(jié)尾是否具有 e f g h”(表示查找字符),這和 ^(abcd)|(efgh)$
不一樣,后者的意思是” 找一個正好是 abcd 或正好是 efgh 的字符串”
this is ^(one|two)$
匹配 one 或者 two。在 ERE 里,^
和 $
永遠是 meta 字符。所以,像 ab^cd
與 ef$gh
這樣的正則表達式仍然是有效的,只是無法匹配到任何東西,因為 ^ 前面有其他的字符串,$ 后面也有字符串,失去了他們的特殊含義。運算符
含義
[..] [= =] [: :]
用于字符對應(yīng)的方括號符號
\metacharacter
轉(zhuǎn)移的 meta 字符
[]
方括號表達式
()
分組
* + ? {}
重復潛質(zhì)的正則表達式
無符號 (no symbol)
連續(xù)字符
^ $
錨點
|
交替
最常見的擴展為 \<
與 \>
運算符, 分別匹配” 單詞 (word)” 的開頭與結(jié)尾, 單詞是由字母, 數(shù)字及下劃線組成的。我們稱這類字符為單詞組成。
例如:\<chop
匹配于 use chopsticks
,但是 eat a lambchop
則不匹配;同樣的 chop>\
匹配與第二個字符串,第一個則不匹配。特別注意:\<chop>\
的表達式下,兩個字符串都不匹配。
運算符
含義
\w
匹配任何單詞組成字符
\W
匹配任何非單詞組成字符
\<\>
匹配單詞的起始和結(jié)尾
\b
匹配單的起始或結(jié)尾處所找到的空字符串 / 這是 \< 與 >\ 運算符的結(jié)合. 注意: 由于 awk 使用 \b 表示后退運算符, 因此 GNU awk(gawk) 使用 \y 表示此功能。
\B
匹配兩個單詞組成字符之間的空字符串
\’ \ `
分別匹配 emacs 緩沖區(qū)的開始與結(jié)尾.GNU 程序 (wmacs) 通常將他們是位 ^ 和 $ 同義。
例子:'<!-\?[^-]\+'#<
后面是 ! 然后是 0~1 個-,最后是一個非-字符。