0

我正在尝试为以下 3 种情况编写一个通用的正则表达式:

  • 超自然_S07E23_720p_HDTV_X264-DIMENSION.mkv
  • the.listener.313.480p.hdtv.x264-2hd.mkv
  • How.I.met.your.mother.s02e07.hdtv.x264-xor.avi

现在我的常规 exoression 应该从原始字符串中删除系列名称,即上述字符串的输出将是:

  • 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

正如 StanleyZ 所说,你总是会遇到包含数字的名字的麻烦。

但是,如果您将这些特殊情况分开,您可以尝试:

#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
  !;

输出:

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'

注意:你不是在做违法的事吗?;)

于 2012-09-14T07:28:38.437 回答