Perl:帮助编写正则表达式

时间:2012-09-14 06:54:53

标签: regex perl

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

  • 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

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

  • 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:理解正则表达式正在做什么将被理解。

2 个答案:

答案 0 :(得分:4)

您可以检测。下一个标记是否包含数字,如果不包含,则将其视为名称的一部分。

但是,我个人认为没有完美的解决方案。它仍然遇到类似的问题:

24.313.480p.hdtv.x264-2hd.mkv            // 24
Warehouse.13.s02e07.hdtv.x264-xor.avi    // warehouse 13

答案 1 :(得分: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'

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