2012-05-04 29 views
0

我有以下聲明:爲什麼選擇這個文件?

Directory.GetFiles(filePath, "A*.pdf") 
.Where(file => Regex.IsMatch(Path.GetFileName(file), "[Aa][i-lI-L].*")) 
.Skip((pageNum - 1) * pageSize) 
.Take(pageSize) 
.Select(path => new FileInfo(path)) 
.ToArray() 

我的問題是,上述說法也找到文件「Adali.pdf」它不應該 - 但我想不出爲什麼。

上面的語句應該只選擇以a開頭的文件,以及第二個字母在i-1範圍內的文件。

回答

2

因爲它匹配Adali採取第三和第四個字符(al):

Adali 
    -- 

嘗試使用在你的正則表達式^它允許尋找字符串(regex cheatsheet)開始:

Regex.IsMatch(..., "^[Aa][i-lI-L].*") 

而且我懷疑你完全需要星號。

PS:作爲一個腳註,讓我注意到這個問題似乎沒有寫得那麼好。您應該嘗試自己調試此代碼,特別是您應該嘗試在沒有LINQ的情況下檢查您的正則表達式。我確信這裏沒有任何關於LINQ(你在問題中使用的標籤)的問題,但問題是關於正則表達式(你根本沒有在標籤中提到過)。

0

您並非錨定字符串。這使得正則表達式與Adali.pdf中的al匹配。

將正則表達式更改爲^[Aa][i-lI-L].*如果除了匹配之外不需要任何東西,那麼您只能執行^[Aa][i-lI-L]

0

那麼當您打電話要做到這一點

var f = Directory.GetFiles(tb_Path.Text, "A*.pdf").Where(file => Regex.IsMatch(Path.GetFileName(file), "[Aa][i-lI-L].pdf")).ToArray(); 

「*」 阿達利接受正則表達式

相關問題