0

我正在尝试使用正则表达式来匹配具有特定扩展名的某些文件名。

我有一个日志文件,我需要在其中找到具有特定扩展名的文件路径。

我啜饮了整个文件,现在想应用正则表达式。

日志文件:

/xyz/arb_path/abc.rb /xyz/arb_path/def.xml foo bar /xyz/arb_path/ghi.pl foo bar /xyz/arb_path/jkl.xml /xyz/arb_path/mno.rb
foo bar '/xyz/arb_path/pqr.pl'
富吧'/xyz/arb_path/stu.rb'

正则表达式应匹配所有*.rb文件或所有*.pl文件。

/xyz/arb_path/ghi.pl
/xyz/arb_path/pqr.pl

或者

/xyz/arb_path/abc.rb
/xyz/arb_path/mno.rb
/xyz/arb_path/stu.rb

谢谢。

4

6 回答 6

1

这是我的做法:

files = %w[/xyz/abc.pl /xyz/def.rb /xyz/ghi.pl /xyz/jkl.rb /xyz/mno.pl foo.rb bar.pl /xyz/foo.java ]
files.grep(%r[/xyz/.+\.(?:rb|pl)$])

=> ["/xyz/abc.pl", "/xyz/def.rb", "/xyz/ghi.pl", "/xyz/jkl.rb", "/xyz/mno.pl"]

如果您不在乎路径是什么,请使用:

files.grep(%r[\.(?:rb|pl)$])
=> ["/xyz/abc.pl",
    "/xyz/def.rb",
    "/xyz/ghi.pl",
    "/xyz/jkl.rb",
    "/xyz/mno.pl",
    "foo.rb",
    "bar.pl"]

您说要匹配的文件名在日志文件中,但没有显示文件格式的示例。如果文件名位于行尾,则$锚点将选择匹配项。如果文件名嵌入在行中,则删除$锚。


这不适用于带有空格的文件路径:(

不修改最后一个示例代码,只添加一些带有嵌入空格的文件名,以及一些带有嵌入空格的路径:

files = %w[/xyz/abc.pl /xyz/def.rb /xyz/ghi.pl /xyz/jkl.rb /xyz/mno.pl foo.rb bar.pl /xyz/foo.java ]
files += [
  'ruby file.rb',
  'perl file.pl',
  '/foo bar/ruby.rb',
  '/foo bar/perl.rb'
]

files.grep(%r[\.(?:rb|pl)$])

在 IRB 中看起来像这样:

irb(main):008:0> files = %w[/xyz/abc.pl /xyz/def.rb /xyz/ghi.pl /xyz/jkl.rb /xyz/mno.pl foo.rb bar.pl /xyz/foo.java ]
[
    [0] "/xyz/abc.pl",
    [1] "/xyz/def.rb",
    [2] "/xyz/ghi.pl",
    [3] "/xyz/jkl.rb",
    [4] "/xyz/mno.pl",
    [5] "foo.rb",
    [6] "bar.pl",
    [7] "/xyz/foo.java"
]
irb(main):009:0> files += [
irb(main):010:1*   'ruby file.rb',
irb(main):011:1*   'perl file.pl',
irb(main):012:1*   '/foo bar/ruby.rb',
irb(main):013:1*   '/foo bar/perl.rb'
irb(main):014:1> ]
[
    [ 0] "/xyz/abc.pl",
    [ 1] "/xyz/def.rb",
    [ 2] "/xyz/ghi.pl",
    [ 3] "/xyz/jkl.rb",
    [ 4] "/xyz/mno.pl",
    [ 5] "foo.rb",
    [ 6] "bar.pl",
    [ 7] "/xyz/foo.java",
    [ 8] "ruby file.rb",
    [ 9] "perl file.pl",
    [10] "/foo bar/ruby.rb",
    [11] "/foo bar/perl.rb"
]
irb(main):015:0> 
irb(main):016:0* files.grep(%r[\.(?:rb|pl)$])
[
    [ 0] "/xyz/abc.pl",
    [ 1] "/xyz/def.rb",
    [ 2] "/xyz/ghi.pl",
    [ 3] "/xyz/jkl.rb",
    [ 4] "/xyz/mno.pl",
    [ 5] "foo.rb",
    [ 6] "bar.pl",
    [ 7] "ruby file.rb",
    [ 8] "perl file.pl",
    [ 9] "/foo bar/ruby.rb",
    [10] "/foo bar/perl.rb"
]

所以,是的,嵌入的空白也被处理了。


'/xyz/arb_path/abc.rb /xyz/arb_path/def.xml foo bar /xyz/arb_path/ghi.pl foo bar /xyz/arb_path/jkl.xml   /xyz/arb_path/mno.rb'.split.grep(/\.(?:rb|pl)$/)
=> [
    [0] "/xyz/arb_path/abc.rb",
    [1] "/xyz/arb_path/ghi.pl",
    [2] "/xyz/arb_path/mno.rb"
]
于 2012-10-24T17:56:32.397 回答
1

这应该为你做

/\.(?:rb|pl)$/i

例子

于 2012-10-24T17:57:25.503 回答
1

这只会给你*.rb:

(\/xyz\/[\w\.\-_\s]+\.rb\b)

这会给你*.pl:

(\/xyz\/[\w\.\-_\s]+\.pl\b)

这会给你两个:

(\/xyz\/[\w\.\-_\s]+\.(pl|rb)\b)
于 2012-10-24T17:59:31.243 回答
0

尝试这个

pattern = /(\/\w+)+.pl/

这将匹配所有 pl 扩展

.pl更改为.rb以匹配 .rb 扩展名

于 2012-10-24T18:14:28.403 回答
0

这应该有效:

(\/xyz\/.*\.(?:rb|pl))
于 2012-10-24T17:57:57.863 回答
-1

这是我在 perl 中遇到的类似问题的解决方案:

#!/usr/bin/perl

use strict;
use warnings;

my $string = "/xyz/abc.pl /xyz/def.rb /xyz/ghi.pl /xyz/jkl.rb /xyz/mno.pl /xyz/ab c.pl /xyz/d ef.rb /xyz/g hi.pl /xyz/jk l.rb /xyz/mn o.pl  /xyz/abc.pli /xyz/def.rbexe /xyz/ghi.pli /xyz/jkl.rbexe /xyz/mno.pli";
my @matches = min_match ($string, '/xyz/', '.pl');
for (@matches) {
    print $_ . "\n";
}

sub min_match {
    my ($string, $start, $end) = @_;

    my $reversed_string = reverse $string;
    my $pattern = '\b' . reverse ($end) . '.*?' . reverse ($start);
    my @matches = ();
    my $continue = 1;

    while ($continue) {
        $continue = 0;
        if ($reversed_string =~ /$pattern/) {
            my $match = reverse $&;
            $reversed_string =~ s/$pattern//;
            push @matches, $match;
            $continue = 1;
        }
    }
    return @matches;
}

输出:

/xyz/mn o.pl
/xyz/g hi.pl
/xyz/ab c.pl
/xyz/mno.pl
/xyz/ghi.pl
/xyz/abc.pl

于 2012-10-24T18:07:50.003 回答