如何使用Regex过滤c#中的文件名?

时间:2015-04-06 16:52:16

标签: c# regex

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

我在上面的代码中尝试做的是获取名称只有数字的所有wave文件。例如“123.wav”

当我尝试上面的代码时,它不会返回任何文件?

我的代码有什么问题?

4 个答案:

答案 0 :(得分:3)

您也可以在没有正则表达式的情况下执行此操作

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

答案 1 :(得分:1)

Directory.GetFiles为您提供包含路径的文件名列表。您试图在结果上匹配您的正则表达式,如下所示: &#34; C:\ WaveFiles \ 123.wav&#34;

您希望整个字符串以数字开头,然后只包含&#34; .wav&#34;部分,当然不会匹配任何文件。

您可能还希望将[0-9]替换为\d的数字,但这是首选项。

试试这个:

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))));

答案 2 :(得分:0)

你的正则表达式字符串有点偏,但还不错。我真的这么做了

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

将匹配所有文件名,这些文件名具有一个或多个数字作为其名称,wav作为其扩展名。

这里真正的问题是你的所有字符串都以C:\WaveFiles\开头,这就是你的正则表达式失败的原因。

您需要添加一行以从完整路径中获取文件名:

Path.GetFilename(path);

答案 3 :(得分:0)

Regex reg =新的正则表达式(@&#34; ^ [0-9] .wav&#34;);                 wavefiles = new Stack(Directory.GetFiles(FolderName,&#34; .wav&#34;)。Where(path =&gt; reg.IsMatch(Path.GetFileName(path))));