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

时间:2018-02-26 16:22:34

标签: regex pcre

我有一些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)。如何在正则表达式中排除文件名后的所有内容?

THX

1 个答案:

答案 0 :(得分:1)

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

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

RegEx Demo

<强>的变化:

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