2012-05-04 1 views
0

J'ai fait la déclaration suivante:Pourquoi sélectionne-t-il ce fichier?

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

Mes problèmes est que l'énoncé ci-dessus trouve également le fichier « Adali.pdf » qui il ne devrait pas - mais je ne peux pas comprendre pourquoi. L'instruction ci-dessus ne doit sélectionner que les fichiers commençant par a, et où la deuxième lettre est comprise dans la plage i-l.

Répondre

2

Parce qu'il correspond Adali en prenant la 3ème et 4ème caractères (al):

Adali 
    -- 

Essayez d'utiliser ^ dans votre regex qui permet la recherche de début de la chaîne (regex cheatsheet):

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

également Je doute que vous ayez besoin d'un astérisque. PS: En tant que sidenote laissez-moi remarquer que cette question ne semble pas être écrit aussi bon. Vous devriez essayer de déboguer ce code vous-même et en particulier vous devriez essayer de vérifier votre regex par rapport à vos cas sans LINQ. Je suis sûr qu'il n'y a rien à faire ici avec LINQ (le tag que vous avez dans votre question), mais le problème concerne les expressions régulières (que vous n'avez pas mentionnées du tout).

0

Vous n'ancrez pas la chaîne. Cela rend l'expression régulière correspondre à al dans Adali.pdf.

Modifier l'expression rationnelle à ^[Aa][i-lI-L].* Vous pouvez faire juste ^[Aa][i-lI-L] si vous n'avez besoin de rien d'autre que la correspondance.

0

Vous devez faire ce

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

Lorsque vous appelez "*" Adali accepter Regex

Questions connexes