0

次の文字列ケースがあります。

  • 私の $str = "Warehouse.13.s01e01.hdtv.xor.avi";
  • my $str = "Warehouse.13.01x01.hdtv.xor.avi";
  • my $str = "Warehouse.13.season01episode01.hdtv.xor.avi";

上記の場合の delimiter( .) は に置き換えることができます_ - \s。上記のケースに一致するように、次の正規表現を作成しましたが、正常に動作します。

my $regex_object = qr{.*?\d{1,2}(?:e|edosipe)?[._\- x]?\d{1,2}(?:s|nosaes)?[._\- ]?(?=\d+)(.*)};

後読みで絶対長が一致する必要があるため、処理する文字列を逆にする必要があったことがわかります\d+。そのため、先読みに変換しました。

上記の場合、出力Warehouse 13は私の必要な出力です。

問題は、上記の正規表現を一致させたくseries nameない場合に含まれていない場合、およびi,e の前に数字が付いているかどうかを確認することです。numbers(13,24)(?=\d+)s|season

私の場合$str'how.i.met.your.mother.s03e13.hdtv.mkv'、上記の正規表現と出力に一致します

how.i.met.your.mother.s0

さて、後読みを使用した後でもこの文字列と一致する理由とそれを修正する方法がわかりません。

4

1 に答える 1

2

なぜこの文字列と一致するのかわかりません

.*?               "vkm.vtdh."
\d{1,2}           "31"
(?:e|edosipe)?    "e"
[._\- x]?         ""
\d{1,2}           "3"
(?:s|nosaes)?     ""
[._\- ]?          ""
(?=\d+)           "0"
(.*)              "0s.rehtom.ruoy.tem.i.woh"

考えられる解決策は、(両方)を変更することです

\d{1,2}

\d{1,2}(?!\d)  # Don't match just "3" of "30".
               # Bonus: Can't match part of "123".

また

(?>\d{1,2})    # Prevents it from matching just
               # one digit if there are two.
               # Note: Can match "12" of "123".

もちろん、そうすると(?=\d+)全体が失敗します。そもそもなぜそこにあるのか分かりません。多分あなたは意味しました(?!\d+)か?(どちらの場合も、+は役に立ちません。)

于 2012-09-24T17:50:06.313 に答える