[正則表示式 正規表示式 (Regular expression)] 群組(Group)與子運算式(Subexpression)的介紹
YehYeh\'s Notepad yehyeh@gmail.com 

正則表示式(Regular Expressions)

群組(Group)與子運算式(Subexpression)

  • 使用( )括住的正則表示式稱為子運算式
  • 一個正則表示式內可以有多個子運算式
  • 每個子運算式匹配的結果稱為群組
  • 一個正則表示式若有多個子運算式,匹配的結果也會有多個群組
  • 每個群組都可以指定名稱,也可以採自動命名
子 運 算 式(Subexpression)
匹配符號 說明 範例樣式 範例匹配
(子運算式) 子運算式
自動命名群組名稱
a(b+)c 匹配數量:2
abcabbc
群組1:b, bb
(?<name>子運算式) 子運算式
群組名稱由name指定
name不能以數字開頭,且不能含標點符號
a(?<A>b+)c 匹配數量:2
abcabbc
群組A:b, bb
(?:子運算式)
(Non-capturing Grouping)
匹配但不記錄成群組 a(?:b)c 匹配數量:2
abcabbc
(?=子運算式)
(Positive Lookahead)
子字串的右邊包含子運算式才形成匹配
用在樣式最右邊或接|
匹配結果不包含子運算式
b(?=c) 匹配數量:2
cab
(?!子運算式)
(Negative Lookahead)
子字串的右邊不包含子運算式才形成匹配 b(!=c) 匹配數量:1
abcabc
(<=子運算式)
(Positive Lookbehind)
子字串的左邊包含子運算式才形成匹配
匹配結果不包含子運算式
(?<=a)b 匹配數量:2
cabc
(?<!=子運算式)
(Negative Lookbehind)
子字串的左邊不包含子運算式才形成匹配 (?<!a)b 匹配數量:1
abcab
(?>子運算式)
(Negative Lookbehind)
匹配不可分割之最長子字串
且不可回溯
(?>a+)\w 匹配數量:2
aa\nab
  • 無寬度右合樣(Positive Lookahead):字串右邊需和聲明(assertion)匹配
  • 無寬度右不合樣(Negative Lookahead):字串右邊需和聲明(assertion)不匹配
  • 無寬度左合樣(Positive Lookbehind):字串左邊需和聲明(assertion)匹配
  • 無寬度左不合樣(Negative Lookbehind):字串左邊需和聲明(assertion)不匹配
Δ 回到最上方

回溯

  • 回溯:匹配字串時,運算式由左往右比對,無法匹配時往左再往右尋找可匹配字串
  • 正則表示式:\w?bb 原始字串:bb
    步驟 比對樣式 比對字串 結果
    1 \w? b 匹配
    2 \w?b bb 匹配
    3 \w?bb bb 不匹配(回溯)
    4 b b 匹配
    5 bb bb 匹配
  • 為什麼使用樣式(?>a+)\w時無法匹配字串aa?
    • 由於(?>子運算式)會找最長字串的特性,所以(?>a+)匹配aa的結果一定會是aa,而不會只有a
    • 正則表示式的引擎比對到(?>a+)時就會匹配出aa,因為不可回溯的特性所以比對到\w就找不到可以匹配的字元,引擎就判斷為不匹配。
  • (?>子運算式)
    正則表示式 原始字串 匹配數量 匹配結果
    a+\w aa
    bb
    2 aa
    ab
    (?>a+)\w aa
    bb
    1 ab
    不可分割字符範例1 不可分割字符範例2
Δ 回到最上方

回溯參考(Back Referencing)

  • 對於有名稱的群組(Named Groups),可以使用回溯參考來比對之後的字串是否有出現和群組成員相同的字串
    回 溯 參 考(Back Referencing)
    匹配符號 說明 範例樣式 範例匹配
    \群組編號 以群組編號回溯參考 a(b*!)\1 匹配數量:2
    ab!b!abb!bb!
    群組1:b!, bb!
    \k<群組名稱> 以群組名稱回溯參考 a(?<A>b*!)\k<A> 匹配數量:2
    ab!b!abb!bb!
    群組A:b!, bb!
Δ 回到最上方

巢狀結構

  • 利用群組及回溯參考可以處理巢狀結構。
    利用群組及回溯參考處理巢狀結構
Δ 回到最上方