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