正则表达式 - 如何在捕获后排除所有内容

Regex - how to exclude everything after a capture

我有一些 IIS 日志,我希望在其中从 cs_uri_stem 字段中提取文件路径和文件名。 IIS 事件示例如下:

2018-02-21 04:39:13 <IPv4> GET /www/images/flash_email_large.gif - 8030 - <IPv4> Mozilla/4.0+(compatible;+MSIE+7.0;+Windows+NT+6.3;+WOW64;+Trident/7.0;+.NET4.0E;+.NET4.0C;+.NET+CLR+3.5.30729;+.NET+CLR+2.0.50727;+.NET+CLR+3.0.30729;+Microsoft+Outlook+16.0.4654;+ms-office;+MSOffice+16) 200 0 0 531

我的正则表达式如下:

.*?(GET|POST|HEAD|OPTIONS|PROPFIND)\s(?P<file_path>(?:[^\/]*\/)*)(?P<file_name>.*)\s-

但是我在文件名后得到了额外的字符(在本例中,flash_email_large.gif)。如何在正则表达式中排除文件名后的所有内容?

感谢

您可以使用这个性能更好的正则表达式在 2 个捕获组中捕获文件路径和文件名:

\s(GET|POST|HEAD|OPTIONS|PROPFIND)\s(?P<file_path>\S*\/)(?P<file_name>\S+)\s-

RegEx Demo

变化:

  1. 将开始的 .*? 替换为 \s
  2. 避免嵌套量词表达式(?:[^\/]*\/)*
  3. 将最后一个 .* 替换为 \S+