Regex 在这种情况下如何提取文件名?
我的输入字符串如下所示:Regex 在这种情况下如何提取文件名?,regex,perl,text-extraction,Regex,Perl,Text Extraction,我的输入字符串如下所示: 1 warning: rg: W, MULT: file 'filename_a.h' was listed twice. 2 warning: rg: W, SCOP: scope redefined in '/proj/test/site_a/filename_b.c'. 3 warning: rg: W, ATTC: file /proj/test/site_b/filename_c.v is not resolved. 4 warning
1 warning: rg: W, MULT: file 'filename_a.h' was listed twice.
2 warning: rg: W, SCOP: scope redefined in '/proj/test/site_a/filename_b.c'.
3 warning: rg: W, ATTC: file /proj/test/site_b/filename_c.v is not resolved.
4 warning: rg: W, MULTH: property file filename_d.vu was listed outside.
如上所述,它们有四种不同的口味。我逐行从日志文件中读取这些
对于指定了路径的文件(第2,3行),我可以使用$file=~s#.*/##提取文件名代码>并且似乎工作正常。是否有一种方法不使用不同类型的条件语句并提取文件名?我只想使用一个干净的正则表达式并提取文件名。Perl的文件::basename
在这种情况下也不起作用
我正在使用Perl。您的问题需要更多约束。例如,将字符串描述为“路径”(或“文件名”)与否的好方法是什么?你可能会说,“嘿,当我看到一个点后面紧跟着字母和数字(但不是符号),而这个点前面也有一堆字符,那么它可能是一个路径或文件名!”
但这并不能捕获所有路径,也不能捕获没有扩展名的文件。因此,我们可能会锁定另一个选项,即“上面的或至少有一个斜杠的字符串。”
(请注意,在上面的示例中,您可能不需要转义斜杠,因为您似乎使用了
作为分隔符。)
无论如何,我的意思是,您需要更严格地指定您的问题,这将自动为您带来令人满意的解决方案。当然,单独使用正则表达式并没有真正“正确”的解决方案:您需要进行文件测试才能做到这一点
要进一步了解此示例,可能需要定义扩展列表:
\s+([^\s]+\.(?:c|h|cc|cpp)|[^\s]*\/[^\s]*)
或者,您可能希望更通用一些,但只允许扩展到最多4个字符:
\s+([^\s]+\.\w{1,4}|[^\s]*\/[^\s]*)
也许你只考虑了一条路径,如果它是从斜线开始的,但是你仍然希望在它的某处至少有一条斜线:
\s+([^\s]+\.\w{1,4}|/[^\s]*\/[^\s]*)
祝你好运。你的问题需要更多的约束。例如,将字符串描述为“路径”(或“文件名”)与否的好方法是什么?你可能会说,“嘿,当我看到一个点后面紧跟着字母和数字(但不是符号),而这个点前面也有一堆字符,那么它可能是一个路径或文件名!”
但这并不能捕获所有路径,也不能捕获没有扩展名的文件。因此,我们可能会锁定另一个选项,即“上面的或至少有一个斜杠的字符串。”
(请注意,在上面的示例中,您可能不需要转义斜杠,因为您似乎使用了
作为分隔符。)
无论如何,我的意思是,您需要更严格地指定您的问题,这将自动为您带来令人满意的解决方案。当然,单独使用正则表达式并没有真正“正确”的解决方案:您需要进行文件测试才能做到这一点
要进一步了解此示例,可能需要定义扩展列表:
\s+([^\s]+\.(?:c|h|cc|cpp)|[^\s]*\/[^\s]*)
或者,您可能希望更通用一些,但只允许扩展到最多4个字符:
\s+([^\s]+\.\w{1,4}|[^\s]*\/[^\s]*)
也许你只考虑了一条路径,如果它是从斜线开始的,但是你仍然希望在它的某处至少有一条斜线:
\s+([^\s]+\.\w{1,4}|/[^\s]*\/[^\s]*)
祝你好运。/\w*\w*/
这将匹配四个不同警告日志中表示的文件名\w将匹配任何单词字符(字母、数字和下划线),因此此正则表达式查找任意数量的单词字符,后跟一个点,后跟更多的单词字符。
这是因为日志中唯一的另一个点位于日志的末尾。/\w*\w*/
这将匹配四个不同警告日志中表示的文件名\w将匹配任何单词字符(字母、数字和下划线),因此此正则表达式查找任意数量的单词字符,后跟一个点,后跟更多的单词字符。
这是因为日志中唯一的另一个点位于日志的末尾。您可以通过两个步骤完成:
- 从每行提取路径
- 从路径中获取basename
输出
您可以分两步完成:
- 从每行提取路径
- 从路径中获取basename
输出
将星星更改为加号,因为它当前将匹配孤立点,以及“两次”、“已解决”等。将星星更改为加号,因为它当前将匹配孤立点,以及“两次”、“已解决”等。
filename_a.h
filename_b.c
filename_c.v
filename_d.vu