在正则表达式中,命名捕获组也会包含完整的字符串
是否有可能让正则表达式将整段字符串作为一个具名捕获组,同时也作为若干个单独的具名捕获组?
我正在尝试解析IIS日志,并且可以使用以下正则表达式通过具名捕获组成功提取所需细节:
^(?<time>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) (?<s_ip>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) (?<method>\w{3,4}) \S+ \S+ (?<s_port>\d{1,5}) \S+ (?<c_ip>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) \S+ \S+ (?<status>\d{3}) \d+ \d+ (?<duration>\d+)$
以下是一个IIS日志的示例:
2026-03-06 19:20:09 10.10.10.10 GET /api/dhs/critical token=1234567890l&server=A 800 - 192.168.0.1 - - 200 0 0 16
除了 time、s_ip、method、s_port、c_ip、status 与 duration 外,我还想要一个,例如 message,它代表整行日志。
解决方案
只需要将整个表达式(除了开头和结尾的锚点之外)再包裹在一个额外的 (?<foo>(...) 之内:
^(?<foo>(?<time>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) (?<s_ip>\d{1,3}\.\d{1,3}\.\d{1,3}
\.\d{1,3}) (?<method>\w{3,4}) \S+ \S+ (?<s_port>\d{1,5}) \S+ (?<c_ip>\d{1,3}\.\d{1,3}
\.\d{1,3}\.\d{1,3}) \S+ \S+ (?<status>\d{3}) \d+ \d+ (?<duration>\d+))$
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。