为什么选择这个文件?

时间:2012-05-04 12:15:38

标签: regex linq

我有以下声明:

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范围内的文件。

3 个答案:

答案 0 :(得分:2)

因为它匹配Adali第3个和第4个字符(al):

Adali
  --

尝试在正则表达式中使用^,以便查找字符串的开头(regex cheatsheet):

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

我也怀疑你需要星号。

PS:作为旁注,让我注意到这个问题似乎没有写得那么好。您应该尝试自己调试此代码,特别是您应该尝试在没有LINQ的情况下检查您的正则表达式。我确定LINQ(你问题中的标签)与此无关,但问题在于正则表达式(你在标签中没有提到)。

答案 1 :(得分:0)

您没有锚定字符串。这使正则表达式与al中的Adali.pdf匹配。

将正则表达式更改为^[Aa][i-lI-L].*如果除了匹配之外不需要任何其他内容,则可以只执行^[Aa][i-lI-L]

答案 2 :(得分: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