2010-06-16 4 views
1

그래서 일부 파일의 이름을 바꾸는 프로그램을 만들려고합니다. 2 [720p의] 내가 원하는 경우, 형식을 변경할 수 있도록하고 싶습니다, 조건부 정규식 C#에서 MatchEvaluator를 사용하지 않고 바꾸기

을 .mkv하지만 - 대부분의 경우, 나는 그들이

[테스트] StupidName는, 다음과 같이하고 싶다. MatchEvaluators를 사용하면 매번 다시 컴파일해야합니다. 그래서 내가 MatchEvaluator를 사용하고 싶지 않습니다.

내가 가진 문제는 그룹이 발견 된 경우 바꾸기를 지시하는 방법 또는 가능한 경우이를 알 수 없다는 것입니다.이 문자열을 포함하십시오. 지금까지 본 적이있는 유일한 구문은 (?<group>:data)과 같은 것이지만이 기능을 사용할 수는 없습니다. 글쎄, 누군가가 아이디어를 가지고 있다면, 그것을 위해 모두.

편집 :

현재 캡처 정규 표현식에 = Regex.Replace 파일 TestFile 101.mkv, 내가 []TestFile - 1[].mkv를 얻을 사용

^(\[(?<FanSub>[^\]\)\}]+)\])?[. _]*(?<SeriesTitle>[\w. ]*?)[. _]*\-[. _]*(?<EpisodeNumber>\d+)[. _]*(\-[. _]*(?<EpisodeName>[\w. ]*?)[. _]*)?([\[\(\{](?<MiscInfo>[^\]\)\}]*)[\]\)\}][. _]*)*[\w. ]*(?<Extension>\.[a-zA-Z]+)$ 

^(?<SeriesTitle>[\w. ]*?)[. _]*[Ss](?<SeasonNumber>\d+)[Ee](?<EpisodeNumber>\d+).*?(?<Extension>\.[a-zA-Z]+)$  

^(?<SeriesTitle>[\w. ]*?)[. _]*(?<SeasonNumber>\d)(?<EpisodeNumber>\d{2}).*?(?<Extension>\.[a-zA-Z]+)$ 

현재 교체 정규식 = [${FanSub}]${SeriesTitle} - ${EpisodeNumber} [${MiscInfo}]${Extension}

. 그룹 FanSub 또는 MiscInfo이있는 경우에만 []이 포함되도록하고 싶습니다.

실제로이 함수를 컴파일하기 때문에 MatchEvaluator로이 문제를 해결할 수 있습니다. 그러나 이것은 프로그램 사용자에게 쉬운 해결책은 아닙니다. 이 문제를 해결할 유일한 아이디어는 특별한 구문을 허용하는 Regex.Replace 함수를 실제로 만드는 것입니다.

+1

질문이 명확하지 않다 ... 자세한 내용을 원하는대로 설명하고 작동하지 않는 코드를 게시하십시오. –

+0

희망 사항이 더 명확합니다. – Buttink

답변

0

임의의 형식을 코드에 하드 코딩하지 않고 동적으로 지정할 수있는 것처럼 들리는 것 같습니다.

아마도 하나의 솔루션은 파일 이름 부분을 특정 그룹으로 나누고 해당 그룹 이름을 사용하는 대체 패턴을 전달하는 것입니다. 이렇게하면 Regex.Replace method을 사용하여 원하는 파일 이름 구조를 반환하는 다른 대체 패턴을 전달할 수 있습니다.

파일 이름의 범주를 설명하지 않았으므로 설명하기 위해 임의의 그룹을 만들었습니다. 샘플에 도시 된 바와 같이

string input = "Testing StupidName Number2 720p.mkv"; 
string pattern = @"^(?<Category>\w+)\s+(?<Name>.+?)\s+Number(?<Number>\d+)\s+(?<Resolution>\d+p)(?<Extension>\.mkv)$"; 

string[] replacePatterns = 
{ 
    "[${Category}]${Name} - ${Number}[${Resolution}]${Extension}", 
    "${Category} - ${Name} - ${Number} - ${Resolution}${Extension}", 
    "(${Number}) - [${Resolution}] ${Name} [${Category}]${Extension}" 
}; 

foreach (string replacePattern in replacePatterns) 
{ 
    Console.WriteLine(Regex.Replace(input, pattern, replacePattern)); 
} 

, (?<Name>pattern)로 지정된 패턴에 지정된 기가, ${Name}하여 여분의 패턴으로 지칭된다 : 여기 짧은 예이다.

이 접근법을 사용하면 그룹 이름을 미리 알고 필요에 따라 패턴을 다시 정렬해야합니다.

+0

이것은 현재 다른 그룹 이름을 사용하여 수행 한 작업입니다. '($ {Number}) - [$ {Resolution}] $ {Name} [$ {Category}] $ {Extension}'을 예로 사용합니다. 우리가 $ {해결책}을 찾지 못하게해라. 어떻게하면 정규 표현식 대신 "["또는 "]"를 포함시킬 수 있을까? 내가 그걸 다루지 않는다면 나는 '(1) - [] Name [720p] .mkv'를 얻는다. 그 바보 같은 빈 공간이 내 문제 다. – Buttink

+0

@Buttink는 'Regex.Replace'에서 즉시 지원되지 않습니다. 하나의 옵션은 각 그룹에 값을 확인한 다음 필요에 따라 패턴을 빌드하는 것이지만 다른 패턴으로 전달할 수있는 유연성이 떨어집니다 (즉, 패턴 1 개로 제한됨).또 다른 옵션은 그룹을 검사하고 * 교체 패턴 *을 파싱하여 누락 된 그룹을 제거하는 것입니다. 패턴이 사용자에게 달려 있다면 오류가 발생하기 쉽습니다. –

+0

.. 푸우>.> 기술적으로 내 질문에 대답 :) – Buttink