命名捕獲組
一些正規表示式風格允許命名捕獲組。你可以在後續程式碼中按名稱引用這些組,而不是通過數字索引引用這些組,即在反向引用中,在替換模式中以及程式的以下行中引用這些組。
數值指數隨著表示式中組的數量或排列的變化而變化,因此相比之下它們更脆弱。
例如,要匹配用單引號或雙引號(['"]
)括起來的單詞(\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>...))