正则表达式 - 如何在捕获后排除所有内容
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-
变化:
- 将开始的
.*?
替换为 \s
- 避免嵌套量词表达式
(?:[^\/]*\/)*
- 将最后一个
.*
替换为 \S+
我有一些 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-
变化:
- 将开始的
.*?
替换为\s
- 避免嵌套量词表达式
(?:[^\/]*\/)*
- 将最后一个
.*
替换为\S+