使用小括號指定一個子表達式后,**匹配這個子表達式的文本**(也就是此分組捕獲的內容)可以在表達式或其它程序中作進一步的處理。
默認情況下,每個分組會自動擁有一個**組號**,規則是:從左向右,以分組的左括號為標志,第一個出現的分組的組號為1,第二個為2,以此類推。
<br/>
呃……其實,組號分配還不像我剛說得那么簡單:
- 分組0對應整個正則表達式
- 實際上組號分配過程是要從左向右掃描兩遍的:第一遍只給未命名組分配,第二遍只給命名組分配--因此所有命名組的組號都大于未命名的組號
- 你可以使用(?:exp)這樣的語法來剝奪一個分組對組號分配的參與權.
**后向引用**用于重復搜索前面某個分組匹配的文本。例如,\\1代表分組1匹配的文本。難以理解?請看示例:
> \\b(\\w+)\\b\\s+\\1\\b
可以用來匹配重復的單詞,像*go go*, 或者*kitty kitty*。
這個表達式首先是一個單詞,也就是單詞開始處和結束處之間的多于一個的字母或數字(\\b(\\w+)\\b),
這個單詞會被捕獲到編號為1的分組中,然后是1個或幾個空白符(\\s+),最后是分組1中捕獲的內容(也就是前面匹配的那個單詞)(\\1)。
<br/>
你也可以自己指定子表達式的**組名**。要指定一個子表達式的組名,請使用這樣的語法:
(?<Word>\\w+)(或者把尖括號換成'也行:(?'Word'\\w+)),
這樣就把\\w+的組名指定為Word了。要反向引用這個分組**捕獲**的內容,你可以使用\\k\<Word>,所以上一個例子也可以寫成這樣:
\\b(?\<Word>\\w+)\\b\\s+\\k\<Word>\\b。
<br/>
使用小括號的時候,還有很多特定用途的語法。下面列出了最常用的一些:

我們已經討論了前兩種語法。第三個(?:exp)不會改變正則表達式的處理方式,只是這樣的組匹配的內容不會像前兩種那樣被捕獲到某個組里面,也不會擁有組號。
“我為什么會想要這樣做?”——好問題,你覺得為什么呢?