2015-04-06 36 views
0
Regex reg = new Regex(@"^[0-9]*\.wav"); 
    Stack<string> wavefiles= new Stack<string>(Directory.GetFiles("c:\\WaveFiles", "*.wav").Where(path => reg.IsMatch(path))); 

我想在上面的代碼中做的是獲得所有的名稱只有數字的波形文件。例如「123.wav」如何使用正則表達式在c#中過濾文件名?

當我嘗試上面的代碼它不會返回任何文件?

任何想法我的代碼有什麼問題?

+0

'正則表達式(@「^ [0-9] + \。wav $」);'但我認爲這不會解決您的問題。 –

+1

一般來說,這些事情你一次只想分解一次你的正則表達式。取出[0-9] *並查看它是否有效。您可能還希望在正則表達式的末尾添加一個$,以確保您不會得到類似23.waver的文件... –

回答

0

你的正則表達式字符串是有點關閉,但並不壞。我真的會這樣做

Regex(@"^\d+\.wav$"); 

這將匹配所有文件名稱都有一個或多個數字作爲其名稱和wav作爲其擴展名。

這裏真正的問題是你的所有字符串都以C:\WaveFiles\開頭,這就是你的正則表達式失敗的原因。

您將要添加一行來得到完整路徑的文件名:

Path.GetFilename(path); 
1

Directory.GetFiles給你的文件名,包括路徑列表。你試圖匹配你的正則表達式這樣的結果: 「C:\ WaveFiles \ 123.wav」。

您期待這整個字符串以數字開頭,然後只包含數字,直到「.wav」部分,這當然不會與您的任何文件匹配。

您可能還想用\d替換[0-9]的數字,但這是一個偏好問題。

試試這個:

Regex reg = new Regex(@"^\d+\.wav"); 

string[] waveFilePaths = Directory.GetFiles("C:\\WaveFiles", "*.wav"); 

Stack<string> filesWithOnlyDigits = new Stack<string>(waveFilePaths 
    .Where(path => reg.IsMatch(Path.GetFileName(path)))); 
3

你也可以不用正則表達式

var files = Directory.GetFiles("c:\\WaveFiles", "*.wav") 
      .Where(f => Path.GetFileNameWithoutExtension(f).All(char.IsDigit)); 
+0

非常優雅和富有創意,我喜歡它!對於不太熟悉正則表達式的人來說,它更具可讀性。你碰巧知道關於性能差異的任何事情嗎? –

+0

@FredKleuver成本最高的部分是'Directory.GetFiles'中涉及的磁盤IO。所以,我不認爲你可以看到兩者之間的任何區別。 – EZI

+0

如果你使用'Where',你可以使用'EnumerateFiles'而不是'GetFiles'。 –

0

正則表達式REG =新的正則表達式(@ 「^ [0-9] .WAV」); wavefiles = new Stack(Directory.GetFiles(FolderName,「 .wav」)。where(path => reg.IsMatch(Path.GetFileName(path))));

+0

** 1)**'[0-9]'或'[0-9] + ** ** ** ** 2)**'.'或'\ **'** ** ** 3 )**我想這不是一個答案。編輯您的問題並在此處添加此代碼。 – EZI

相關問題