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