正則表達式入門(四)選擇,分組和向后引用


分組就是對文本加括號以幫助執行某種操作,比如:

  • 在兩種或更多可選模式中選擇一個
  • 創建子模式
  • 捕獲一個分組后以便之后向后引用
  • 對組合的模式使用某項操作(如量詞)
  • 使用非捕獲分組
  • 原子分組

選擇操作
選擇操作可在多個可選模式中匹配一個。例如,你想在"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)非捕獲分組不會存在內存中,以提高性能

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM