Regex 为什么选择这个文件?

Regex 为什么选择这个文件?,regex,linq,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”文件,

我有以下声明:

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

,因为它匹配
Adali
,使用第三和第四个字符(
al
):

尝试在正则表达式中使用
^
,它允许查找字符串()的开头:

我也怀疑你是否需要星号


PS:作为旁注,让我注意到这个问题似乎写得不太好。您应该尝试自己调试这段代码,尤其应该尝试在没有LINQ的情况下检查您的正则表达式。我确信这里与LINQ(您在问题中的标记)无关,但问题是关于正则表达式(您在标记中根本没有提到正则表达式)。

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

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

您应该这样做

var f = Directory.GetFiles(tb_Path.Text, "A*.pdf").Where(file => Regex.IsMatch(Path.GetFileName(file), "[Aa][i-lI-L].pdf")).ToArray();
当您在正则表达式中调用“.*”时,Adali接受

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