Perl的正则expression式

我有以下由服务器日志文件生成的string。 我正在使用简单事件相关(使用perl正则expression式)来操纵行:

18:37:31 643.65.123.123 []sent /home/mydomain/public_html/court-954fdw/Chairman-confidential-video.mpeg 226 [email protected] 256 

我已经成功地使用perl正则expression式成功地提取用以下模式login的用户。

注: SEC使用的值是从括号中的数据中提取的:

 pattern=sent \/home\/mydomain\/public_html\/(.*)\/(.*) 

但是,在parsing这个文件名时,我一直没有成功,在这种情况下,这个文件名是: Chairman-confidential-video.mpeg

目前,我使用的现有模式拉出整个string:

 Chairman-confidential-video.mpeg 226 [email protected] 256 

我不想要。 任何帮助非常感谢。

我可能会使用:

 pattern=sent \/home\/mydomain\/public_html\/(.*)\/(\S+).* 

这应该提取出除最后一次捕获匹配以外的所有空格字符,剩下的部分留给非捕获匹配。

我会使用以下内容:

 pattern=sent \/home\/mydomain\/public_html\/(.*?)\/\(.* ?)\S*.*$ 

更明确的非贪婪匹配。 你的结果现在将在$ 2。 这假定你不能在public_html下面硬编码任何东西。 这确实留下了尾随空间。

其他答案假定文件名中没有空格,这是一个相当危险的假设。 一个更安全的方法是假定文件名中没有斜线,因为这在linux中是非法的:

 pattern=sent \/home\/mydomain\/public_html\/([^\/]+)\/([^\/]+) [0-9]+ \S+@\S+ [0-9]+$ 

https://regex101.com/上testing