2010-06-16 39 views
1

所以,我試着做一個程序,重命名某些文件。在大多數情況下,我想他們這個樣子,條件正則表達式替換C#不MatchEvaluator

[測試] StupidName - 2 [720P] .MKV

但是,我想能夠改變格式,如果需要的話。如果我使用MatchEvaluators,則必須每次重新編譯。這就是爲什麼我不想使用MatchEvaluator。

我遇到的問題是我不知道如何,或者如果它可能,告訴替換,如果找到一個組,包括此字符串。這個我見過的唯一語法就像(?<group>:data),但我無法得到這個工作。那麼如果有人有一個想法,即時通訊所有的。

編輯:

當前捕獲的正則表達式=

^(\[(?<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}

使用Regex.Replace,文件TestFile 101.mkv,我得到[]TestFile - 1[].mkv。我想要做的就是讓這個[]如果組FanSubMiscInfo發現僅包括在內。

我可以用MatchEvaluator解決這個問題,因爲我真正得到編譯功能。但這對於該計劃的用戶來說不是一個簡單的解決方案。我唯一需要解決的另一個想法是實際製作我自己的接受特殊語法的Regex.Replace函數。

+1

你的問題不是很清楚...請解釋你想要的更多細節,併發布你的代碼不起作用 – 2010-06-16 19:44:47

+0

希望更清楚。 – Buttink 2010-06-16 20:38:55

回答

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}'爲例。可以說我們沒有找到$ {Resolution},我怎樣才能讓它正則表達式替換不會包含「[」或「]」。如果我不對付,我得到「(1) - []名稱[720P] .MKV」和那個愚蠢的空白是我的問題。 – Buttink 2010-06-16 20:26:57

+0

@Buttink在開箱即用的'Regex.Replace'中不受支持。一個選擇是檢查各組爲一個值,然後根據需要建立的模式,但你失去傳遞不同圖案的靈活性(即你將被限制到1種圖案)。另一種選擇是檢查組並解析*替換模式*以從中刪除缺失的組。如果模式取決於用戶,這很可能會出錯。 – 2010-06-16 21:11:50

+0

.. poo>。>技術上你回答了我的問題:) – Buttink 2010-06-16 21:43:05