2

以下のスクリプトを実行すると、次のようになります。

$VAR1 = [
          'ok0.ok]][[file:ok1.ok',
          undef,
          undef,
          'ok2.ok|dgdfg]][[file:ok3.ok',
          undef,
          undef,
          undef,
          undef,
          undef,
          undef,
          undef,
          undef,
          undef,
          undef,
          undef,
          undef,
          undef
        ];

私が望んでいた場所、ok0.ok ok1.ok ok2.ok ok3.okそして理想的にはok4.ok ok5.ok ok6.ok ok7.ok

質問

誰かが私が間違っていることを見ることができますか?

#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

my $html = "sdfgdfg[[file:ok0.ok]][[file:ok1.ok ]] [[file:ok2.ok|dgdfg]][[file:ok3.ok |dfgdfgg]] [[media:ok4.ok]] [[media:ok5.ok ]] [[media:ok6.ok|dgdfg]] [[media:ok7.ok |dfgdfgg]]ggg";

my @seen = ($html =~ /file:(.*?) |\||\]/g);

print Dumper \@seen;
4

6 に答える 6

2

否定された文字クラスは、物事を少し単純化できると思います。アンカー(ファイル:、またはメディア:)については明示し、シーケンスを終了するもの(スペース、パイプ、または閉じ括弧)については明示してください。次に、キャプチャします。

my @seen = $html =~ m{(?:file|media):([^\|\s\]]+)}g;

説明:

my @seen = $html =~ m{
    (?:file|media):        # Match either 'file' or 'media', don't capture, ':'
    ( [^\|\s\]]+ )         # Match and capture one or more, anything except |\s]
}gx;

]、、、|または\sに遭遇するとすぐにキャプチャが停止します。

于 2012-06-26T09:39:50.247 に答える
1

file:スペース、パイプ、または閉じ角かっこで始まり、終わるすべてのものを一致させようとしているようです。

ただし、正規表現の最後にあるORステートメントは、(角かっこ)括弧自体の間にある必要があります。

my @seen = ($html =~ /file:(.*?)[] |]/g);

メディアが必要な場合:ブロックも、またはファイル部分。ここでは、キャプチャしないグループが必要になる場合があります。

my @seen = ($html =~ /(?:file|media):(.*?)[] |]/g);

使い方

最初のステートメントは、'file:'とa ]|または。の間のすべてをキャプチャします

2番目のステートメントも同じですが、ファイルメディアの両方を使用します。(?:group)代わりに非キャプチャグループを使用する(group)ため、単語はあなたのに入れられません@seen

于 2012-06-26T09:37:51.423 に答える
1

で試してみてください

my @seen = ($html =~ /\[\[\w+:(\w+\.\w+)\]\]/g);
于 2012-06-26T09:41:16.783 に答える
1

これはあなたの正規表現が行うことです:

 ...
 my $ss = qr {
              file: # start with file + column as anchor
              (         # start capture group
               .*?      # use any character in a non-greedy sweep
              )         # end capture group
              \s        # end non-greedy search on a **white space**

              |     # OR expression encountered up to here with:
              \|     # => | charachter  
              |      # OR expression encountered up to here with:
              \]       # => ] charachter  
              }x;

 my @seen = $html =~ /$ss/g;
 ...

そしてこれはあなたの正規表現がすることになっていることです:

 ...
 my $rb = qr {
             \w :      # alphanumeric + column as front anchor
             (         # start capture group 
              [^]| ]+  # the terminating sequence
             )         # end capture group 
            }x;

 my @seen = $html =~ /$rb/g;
 ...

短く簡潔な正規表現が必要で、何をするかを知っている場合は、キャプチャグループを完全に削除し、リストコンテキストで完全なキャプチャチャンクをポジティブルックビハインドとともに使用できます。

 ...
 my @seen = $html =~ /(?<=(?:.file|media):)[^] |]+/g; # no cature group ()
 ...

または、示されているようなデータ内の他の構造を処理する必要がない場合は:、唯一のアンカーとして使用します。

 ...
 my @seen = $html =~ /(?<=:)[^] |]+/g;   # no capture group and short
 ...

よろしく

rbo

于 2012-06-26T10:18:17.390 に答える
0

ファイル名に使用できる文字によっては、おそらく必要だと思います

my @seen = $html =~ /(?:file|media):([\w.]+)/g;

までのすべてをキャプチャok0.okok7.okます。

これは、英数字に加えてアンダースコアとドットを含むファイル名に依存しています。

于 2012-06-26T10:27:01.083 に答える
0

これがあなたが必要としていたものであることを願っています。

#!/usr/bin/perl

use strict;  

use warnings;

use Data::Dumper;


my $string = "sdfgdfg[[file:ok0.ok]][[file:ok1.ok ]] [[file:ok2.ok|dgdfg]][[file:ok3.ok |dfgdfgg]] [[media:ok4.ok]] [[media:ok5.ok ]] [[media:ok6.ok|dgdfg]] [[media:ok7.ok |dfgdfgg]]ggg";

my @matches;

@matches = $string =~ m/ok\d\.ok/g;

print Dumper @matches;

出力:

$VAR1 = 'ok0.ok';

$VAR2 = 'ok1.ok';

$VAR3 = 'ok2.ok';

$VAR4 = 'ok3.ok';

$VAR5 = 'ok4.ok';

$VAR6 = 'ok5.ok';

$VAR7 = 'ok6.ok';

$VAR8 = 'ok7.ok';

よろしく、キラン。

于 2012-06-26T12:06:27.977 に答える