2012-05-04 2 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-l.

ответ

2

Потому что он соответствует Adali принимая 3 и 4 символов (al):

Adali 
    -- 

Попробуйте использовать в своем регулярном выражении ^, который позволяет искать в начале строки (regex cheatsheet):

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

Также Я сомневаюсь, что вам нужна звездочка.

PS: В качестве оповещения позвольте мне заметить, что этот вопрос, похоже, не написан так хорошо. Вы должны попробовать отладить этот код самостоятельно, и особенно вы должны попытаться проверить ваше регулярное выражение на ваши случаи без LINQ. Я уверен, что здесь нет ничего общего с LINQ (тег, который у вас есть в вашем вопросе), но проблема в регулярных выражениях (которые вы вообще не упоминали в тегах).

0

Вы не привязываете строку. Это позволяет регулярному выражению al в Adali.pdf.

Изменить регулярное выражение на ^[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(); 

При вызове "*" Adali принять в Regex

Смежные вопросы