命名捕獲組

一些正規表示式風格允許命名捕獲組。你可以在後續程式碼中按名稱引用這些組,而不是通過數字索引引用這些組,即在反向引用中,在替換模式中以及程式的以下行中引用這些組。

數值指數隨著表示式中組的數量或排列的變化而變化,因此相比之下它們更脆弱。

例如,要匹配用單引號或雙引號(['"])括起來的單詞(\w+),我們可以使用:

(?<quote>['"])\w+\k{quote}

這相當於:

(['"])\w+\1

在這種簡單的情況下,常規編號的捕獲組沒有任何缺點。

在更復雜的情況下,使用命名組將使表示式的結構對讀者更明顯,這提高了可維護性。

日誌檔案解析是受益於組名稱的更復雜情況的示例。這是 Apache 通用日誌格式 (CLF):

127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326

以下表示式將部件捕獲到命名組中:

(?<ip>\S+) (?<logname>\S+) (?<user>\S+) (?<time>\[[^]]+\]) (?<request>"[^"]+") (?<status>\S+) (?<bytes>\S+)

語法取決於風格,常見的是:

  • (?<name>...)
  • (?'name'...)
  • (?P<name>...)

反向引用:

  • \k<name>
  • \k{name}
  • \k'name'
  • \g{name}
  • (?P=name)

在 .NET 風格中,你可以擁有多個共享相同名稱的組,它們將使用捕獲堆疊

在 PCRE 中,你必須使用 (?J) 修飾符(PCRE_DUPNAMES)或使用分支重置組 (?|) 明確啟用它。但是隻能訪問最後捕獲的值。

(?J)(?<a>...)(?<a>...)
(?|(?<a>...)|(?<a>...))