0

特定のファイル名と特定の拡張子を一致させる正規表現を取得しようとしています。

特定の拡張子を持つファイル パスを見つける必要があるログ ファイルがあります。

ファイル全体を丸呑みして、正規表現を適用したいと思います。

ログ ファイル:

/xyz/arb_path/abc.rb /xyz/arb_path/def.xml foo バー /xyz/arb_path/ghi.pl foo バー /xyz/arb_path/jkl.xml /xyz/arb_path/mno.rb
foo バー '/xyz/arb_path/pqr.pl'
foo バー '/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 のみが得られます。

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

これにより、*.pl のみが得られます。

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

これにより、次の両方が得られます。

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

これはあなたのためにそれをするはずです

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

于 2012-10-24T17:57:25.503 に答える
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 に答える