正则表达式用于提取S'#'E'#'

时间:2014-03-11 18:17:02

标签: javascript regex

我们有一堆名为'My.File.S01E01.something.something''My.File.S01E02.another.something''My_File.S1E1.something'的文件。

我要做的是在S01E01S1E1之前提取文字(例如,上面的内容会返回My.File.My_File.并提取S和E的值为S01 (S = 01)S1 (S = 1)等。

有谁知道我怎么做到这一点?或指出我正确的方向,我真的不确定。

3 个答案:

答案 0 :(得分:1)

您可以在S##之前匹配所有文字,而不必担心具体匹配S##E##。关键是检查S之前确保没有数字或字母。例如,您可能希望忽略filenames02无效。

此外,一些种子在名称前面包含垃圾邮件。例如[torrent.com]My.File.S01E01.zip你也可以跳过它(如果你想要的话)。

仅匹配文件名的正则表达式为/^(\[.+\])?(.+[^a-z0-9])(?=S\d)/i。如果您想要包含垃圾邮件,那么您只需要/^(.+[^a-z0-9])(?=S\d)/i

var names = [
    "My.File.S1E1.something",
    "My File S01E01.something",
    "[--spam--] My.File.S01E01.something",
    "My.Files S01 something",

    // these won't match
    "My.FilesS01E01.something"
];
for(var i=0; i < names.length; i++)
{
    var name = names[i];
    name = name.match(/^(\[.+\])?(.+[^a-z0-9])(?=S\d)/i);
    $('body').append('<div>'+name[2]+'</div>');
}

http://jsfiddle.net/thinkingmedia/fZDM4/

答案 1 :(得分:0)

尝试:

var file = 'My.File.S01E02.something.something';
var S = file.match(/(?:\.S)([0-9]+)(?:E[0-9]+\.)/)[1];
var E = file.match(/(?:\.S[0-9]+E)([0-9]+)(?:\.)/)[1];

下一步:

S === "01"
E === "02"

答案 2 :(得分:0)

这更像是一种算法,而不是简单的正则表达式 http://jsfiddle.net/GqJPU/

var file1 = 'My.File.S01E01.something.something';
var file2 = 'My.File.S01E02.another.something';
var file3 = 'My_File.S1E1.something';

var myFiles = [file1, file2, file3];

myFiles.forEach(function(e, i){
      var myReturn = returnFileDefs(e);
      console.log(myReturn);
});

function returnFileDefs(element){
    var myResult = {};
    var mySplit = element.split('\.');
    var front = mySplit[0];
    var re = /_/g;      

    if(re.test(front)){
        myResult.front = front;
        myResult.middle = mySplit[1];
    }else{
        myResult.front = mySplit[0]+'.'+mySplit[1];
        myResult.middle = mySplit[2];
    }
    myResult.S = myResult.middle.match(/(S)([0-9]+)/)[2];
    myResult.E = myResult.middle.match(/(E)([0-9]+)/)[2];
    return myResult;
}