0

以下の 3 つの場合に共通の正規表現を作成しようとしています。

  • Supernatural_S07E23_720p_HDTV_X264-DIMENSION.mkv
  • the.listener.313.480p.hdtv.x264-2hd.mkv
  • どうやってあなたのお母さんに会いましたか.s02e07.hdtv.x264-xor.avi

これで、私の通常の強制は元の文字列からシリーズ名を削除する必要があります。つまり、上記の文字列の出力は次のようになります。

  • S07E23_720p_HDTV_X264-DIMENSION.mkv
  • 313.480p.hdtv.x264-2hd.mkv
  • s02e07.hdtv.x264-xor.avi

基本的なケースとしてsupernatural string、以下の正規表現を書きましたが、正常に機能しましたが、シリーズ名が複数の単語を取得するとすぐに失敗します。

$string =~ s/^(.*?)[\.\_\- ]//i; #delimiter can be (. - _ )

したがって、私が考えていた上記のケースをどのように進めるかはわかり\w+{1,6}ませんが、必要なこともできませんでした。

PS: 正規表現が何をしているかの説明をいただければ幸いです。

4

2 に答える 2

4

. の次のトークンに数字が含まれているかどうかを検出できます。含まれていない場合は、名前の一部と見なします。

ただし、個人的には、これに対する完全な解決策はないと思います。次のような問題はまだ発生します。

24.313.480p.hdtv.x264-2hd.mkv            // 24
Warehouse.13.s02e07.hdtv.x264-xor.avi    // warehouse 13
于 2012-09-14T07:20:15.267 に答える
3

As StanleyZ said, you'll always get into trouble with names containing numbers.

But, if you take these special cases appart, you can try :

#perl

$\=$/;

map {

    if (/^([\w\.]+)[\.\_]([SE\d]+[\.\_].*)$/i) {
        print "Match : Name='$1'        Suffix='$2'";
    } else {
        print "Did not match $_";
    }
}
qw!
    Supernatural_S07E23_720p_HDTV_X264-DIMENSION.mkv
    the.listener.313.480p.hdtv.x264-2hd.mkv
    How.I.met.your.mother.s02e07.hdtv.x264-xor.avi
  !;

which outputs :

Match : Name='Supernatural'     Suffix='S07E23_720p_HDTV_X264-DIMENSION.mkv'
Match : Name='the.listener'     Suffix='313.480p.hdtv.x264-2hd.mkv'
Match : Name='How.I.met.your.mother'     Suffix='s02e07.hdtv.x264-xor.avi'

note : aren't you doing something illegal ? ;)

于 2012-09-14T07:28:38.437 に答える