Regex Perl:帮助编写正则表达式

Regex Perl:帮助编写正则表达式,regex,perl,Regex,Perl,我正在尝试为以下3种情况编写一个通用正则表达式: 超自然的_S07E23_720p_HDTV_X264-DIMENSION.mkv .listener.313.480p.hdtv.x264-2hd.mkv How.I.met.your.mother.s02e07.hdtv.x264-xor.avi 现在,我的正则表达式应该从原始字符串中删除序列名,即上述字符串的输出将是: S07E23_720p_HDTVx264-DIMENSION.mkv 313.480p.hdtv.x264-2hd.m

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

  • 超自然的_S07E23_720p_HDTV_X264-DIMENSION.mkv
  • .listener.313.480p.hdtv.x264-2hd.mkv
  • How.I.met.your.mother.s02e07.hdtv.x264-xor.avi
现在,我的正则表达式应该从原始字符串中删除序列名,即上述字符串的输出将是:

  • S07E23_720p_HDTVx264-DIMENSION.mkv
  • 313.480p.hdtv.x264-2hd.mkv
  • s02e07.hdtv.x264-xor.avi
现在,对于超自然字符串的基本情况,我编写了下面的正则表达式,它工作得很好,但一旦序列名得到多个单词,它就失败了

$string =~ s/^(.*?)[\.\_\- ]//i; #delimiter can be (. - _ )
因此,我不知道如何继续处理我按照
\w+{1,6}
思路思考的上述案例,但它也没有完成所需的工作


PS:解释正则表达式所做的事情将被理解。

< p>您可以检测到下一个标记是否包含数字,如果不是,将其视为名称的一部分。 然而,我个人认为没有完美的解决方案。它仍然会遇到一些问题,比如:

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

正如斯坦利兹所说,你总是会因为名字中包含数字而陷入麻烦

但是,如果您选择这些特殊情况,您可以尝试:

#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'

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

你怎么知道你的电影名字什么时候结束?最后一个分隔符是
-
,但电影名称本身由这两个分隔符分隔。@Cupidvogel:您可以看到模式
moviename
后跟
分隔符
后跟
S07E23或313或s02e07或3x13
。所以你几乎可以说MovieName后面会有一个模式,比如
[S | S]?\d+[\.\.\\.\uux]?[e | e]\d+
@ronnie:试试这个^[\.\d]+[\.\u\-]。它应该与完整的字符标题一起使用。字符类
[-.\u]
会删除那些难看的反斜杠。点在字符类中并不特殊,因为除了
-
^
和反斜杠字母字符之外,它什么都不是。在正则表达式中是
\。
\D
@ronnie之前是必需的,你说得对\D够了,我太粗心了。顺便问一下,如果答案对你有帮助的话,你能接受吗?没错,观察这一集的模式,制作案例,如果你真的需要的话,把它转换成结构性的。