【问题标题】:how to extract filename in this situation?在这种情况下如何提取文件名?
【发布时间】:2012-05-31 19:33:35
【问题描述】:

我的输入字符串如下所示:

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 的File::basename 在这种情况下也不起作用。

我正在使用 Perl。

【问题讨论】:

    标签: regex perl text-extraction


    【解决方案1】:

    您可以分两步完成:

    • 从每一行中提取路径
    • 从路径中获取基名

    Example

    #!/usr/bin/perl -n
    use feature 'say';
    use File::Basename;
    
    #NOTE: assume that unquoted path has no spaces in it 
    say basename($1.$2) if /(?:file|redefined in)\s+(?:'([^']+)'|(\S+))/;
    

    输出

    filename_a.h
    filename_b.c
    filename_c.v
    filename_d.vu
    

    【讨论】:

      【解决方案2】:

      您的问题需要更多约束。例如,将字符串表征为“路径”(或“文件名”)的好方法是什么?你可能会说,“嘿,当我看到一个点后面紧跟着字母和数字(但不是符号),而且那个点之前还有一堆字符,那么它可能是一个路径或文件名!”

      \s+([^\s]+\.\w+)
      

      但这并不能捕获所有路径,也不能捕获没有扩展名的文件。因此,我们可能会选择另一种说法,“要么是上面的,要么是一个至少有一个斜线的字符串。”

      \s+([^\s]+\.\w+|[^\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]*)
      

      祝你好运。

      【讨论】:

        【解决方案3】:

        /\w*.\w*/ 这将匹配四个不同警告日志中表达的文件名。 \w 将匹配任何单词字符(字母、数字和下划线),因此此正则表达式查找任意数量的单词字符,后跟一个点,然后是更多单词字符。 这是因为日志中唯一的另一个点位于日志的末尾。

        【讨论】:

        • 将星号更改为加号,因为目前这将匹配孤点,以及“两次”、“已解决”等。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-04
        • 1970-01-01
        • 2016-04-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多