Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在这种情况下如何提取文件名?_Regex_Perl_Text Extraction - Fatal编程技术网

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