分組就是對文本加括號以幫助執行某種操作,比如:
- 在兩種或更多可選模式中選擇一個
- 創建子模式
- 捕獲一個分組后以便之后向后引用
- 對組合的模式使用某項操作(如量詞)
- 使用非捕獲分組
- 原子分組
選擇操作
選擇操作可在多個可選模式中匹配一個。例如,你想在"The rime of the Ancyent Mariner"中找出the出現過多少次,包括THE,The和the的形式。
若在RegExr上方文本框輸入
(THE|The|the)
則看到所有the都被標亮。
可以使用選項來使分組更簡短。例如:
(?i)
可以讓模式不再區分大小寫。所有上面帶選擇操作的模式可以寫成
(?i)the
正則表達式中的選項
子模式
正則表達式中的子模式是指分組中的一個或多個分組。
例如:
(the|The|THE)
(t|T)h(e|eir)
括號對於子模式不是必須的。
\b[tT]h[ceinry]*\b
這個模式會匹配the或The還有thee,thy以及thence等單詞。
- \b匹配單詞起始邊界
- [tT]是字符組,它匹配小寫字母t或者大寫字母T。可以看做是第一個子模式。
- 然后匹配小寫字母h
- 第二個也就是最后一個子模式也表示為字符組[ceinry],后面量詞*表示一個或多個
- \b單詞的結尾邊界
捕獲分組和后向引用
當一個模式的全部或者部分內容由一對括號分組時,它就對內容進行捕獲並臨時存儲與內存中。可以通過后向引用重用捕獲的內容。
\1
或者
$1
這里\1或$1引用的是第一個捕獲的分組,而\2或$2引用的是第二個捕獲的分組,以此類推。
命名分組
命名分組就是有名字的分組。
假如你要查找含有連續六個0的字符串:
000000
就可以用這個模式對連續三個0的分組命名:
(?<z>0{3})
然后你可以再使用該分組:
(?<z>0{3})\k<z>
或者
(?<z>0{3})\k'z'
或者
(?<z>0{3})\g{z}
命名分組的語法
非捕獲分組
非捕獲分組不會將內容存儲在內存中。在你並不想引用分組的時候可以使用,因為沒有存儲內容,所以可以帶來性能上的提升。
(the|The|THE)
這個分組不需要任何后向引用,所以可以寫成非捕獲分組:
(?:the|The|THE)
添加選項將其變為不區分大小寫的模式:
(?i)(?:the)
也可以這樣寫:
(?:(?i)the)
最推薦的寫法是這樣的:
(?i:the)
原子分組
另一種非捕獲分組是原子分組。
如果你使用的正則表達式引擎進行回溯操作,這種分組就可以將回溯操作關閉,但它只針對原子分組內的部分,而不針對整個正則表達式。
(?>the)
小結:
1.(THE|The|the),通過豎線|可以多個可選模式中匹配一個
2.括號()內的模式和字符組[]都可以看做一個分組
3.括號()內的分組會被捕獲到內存中,使用\1或者$1后向引用
4.通過命名的分組可以用名字來后向引用
5.(?:the|The|THE)非捕獲分組不會存在內存中,以提高性能