我们有一堆名为'My.File.S01E01.something.something'
或'My.File.S01E02.another.something'
或'My_File.S1E1.something'
的文件。
我要做的是在S01E01
或S1E1
之前提取文字(例如,上面的内容会返回My.File.
或My_File.
并提取S和E的值为S01 (S = 01)
或S1 (S = 1)
等。
有谁知道我怎么做到这一点?或指出我正确的方向,我真的不确定。
答案 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>');
}
答案 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;
}