2015-12-21 2 views
2

Im пытается сортировать мои телешоу из моих фильмов, и я решил, что лучший способ сделать это - идентифицировать их в сезонах сериала и эпизоде.Delphi - как проверить, содержит ли строка заданный формат символов

все мои телешоу имеют следующий формат S00E00.

попробовал следующую

if (Pos(IntToStr(I), SR.Name) > 0) and (Pos('S', SR.Name) > 0) then 
result := true; 

, но это не работает, потому что если фильм имел титул Содержащие «s» и любое количество его скопирует его в поперечнике.

нужно будет что-то вроде если строка поз «буквы с последующим целым числом, целым числом, буквой е, целое число, целое число», то результат: = истинный

был независимо, если этот эпизод S01E03 или S09E12 будет по-прежнему копировать ,

.........................................

отредактировано 12/22/2015

.........................................

Спасибо Реми не думал, что это будет так просто.

вот процедура, которую необходимо прояснить.

procedure TForm7.TvShowCopy (Format: string);// Format would be .mp4 or whatever you're using but since the procedure searches for a name matching "S00E00" format I suppose you wouldn't need the format and could just use *.*. 

begin 

    aTvshowFiles := TDirectory.GetFiles(STvshows,format,// aTVshowfiles is a TStringDynArray , STvshows is the Source directory for the TV shows. 
        TSearchOption.soAllDirectories, 
        function(const Path: string; const SR: TSearchRec):Boolean 
        begin 
        result:= TRegEx.IsMatch(SR.Name, 'S[0-9][0-9]E[0-9][0-9]') 
        end); 
        CopyFilesToPath(aTvshowFiles, DTvshows); 
end; 

проверено и будет работать.

+1

T шляпа звучит как работа для регулярных выражений. –

+0

Какая версия Delphi? И где хранятся данные (в памяти, в базе данных или где-то еще)? Вам нужно добавить дополнительные сведения. Пожалуйста, отредактируйте свой вопрос, чтобы сделать это, вместо того, чтобы добавлять их через комментарии. –

+0

@KenWhite: 'SR.Name' подразумевает, что используется TSearchRec', что будет означать, что перечисление имен файлов используется. –

ответ

7

Как Рон упоминалось в комментариях, вы можете использовать regular expression:

uses 
    ..., RegularExpressions; 

function ContainsSeasonAndEpisode(const Input: String): Boolean; 
begin 
    Result := TRegEx.IsMatch(Input, 'S[0-9][0-9]E[0-9][0-9]'); // or: 'S\d\dE\d\d' 
end; 

... 

Result := ContainsSeasonAndEpisode(SR.Name); 

Как Кен упоминалось в комментариях, вы можете также использовать MatchesMask(), например, если вы тестируете имя файла:

uses 
    ..., Masks; 

function ContainsSeasonAndEpisode(const Input: String): Boolean; 
begin 
    Result := MatchesMask(Input, '*S[0-9][0-9]E[0-9][0-9]*'); 
end; 

... 

Result := ContainsSeasonAndEpisode(SR.Name); 

Или вы можете просто сравнить строку ввода вручную, например:

uses 
    ..., StrUtils; 

function ContainsSeasonAndEpisode(const Input: String): Boolean; 
begin 
    Result := false; 
    Idx := Pos('S', Input); 
    while Idx <> 0 do 
    begin 
    if (Idx+5) > Length(Input) then 
     Exit; 

    if (Input[Idx+1] >= '0') and (Input[Idx+1] <= '9') and 
     (Input[Idx+2] >= '0') and (Input[Idx+2] <= '9') and 
     (Input[Idx+3] = 'E') and 
     (Input[Idx+4] >= '0') and (Input[Idx+4] <= '9') and 
     (Input[Idx+5] >= '0') and (Input[Idx+5] <= '9') then 
    begin 
     Result := true; 
     Exit; 
    end; 

    Idx := PosEx('S', Input, Idx+1); 
    end; 
end; 

... 

Result := ContainsSeasonAndEpisode(SR.Name); 
+2

С информацией о том, что поиск соответствует имени файла в определенном шаблоне, * MatchesMask * также может быть альтернативой - он поддерживает сопоставление шаблонов псевдо-регулярного выражения. –

Смежные вопросы