寻找简单但功能强大的Windows通配符(`*,?`)匹配实现

时间:2012-01-12 21:23:04

标签: c# .net regex wildcard

我正在寻找简单而强大的方法来实现在字符串中匹配的Windows风格的*?通配符。

BeginsWith()EndsWith()过于简单,无法涵盖所有​​情况,而将通配符表达式转换为正则表达式看起来很复杂,而且我不确定性能。

想要一个快乐的媒体。

编辑:我正在尝试解析.gitignore文件并匹配相同的文件,就像Git一样。这意味着:

  • 文件应该在存储库的索引之外(所以我正在检查文件的路径与存储在索引中的路径)
  • .gitignore中的模式数量可能很大;
  • 要检查的文件数量也可能很大。

4 个答案:

答案 0 :(得分:4)

正则表达式中的Windows通配符?*的等效项仅为..*


[编辑] 鉴于您的新编辑(说明您正在寻找实际文件),我会完全跳过翻译并让.Net使用Directory.GetFiles()

(请注意,出于某种原因,将?传递给Directory.GetFiles()匹配“零个或一个字符”,而在Windows中它总是匹配一个字符)

答案 1 :(得分:2)

要获得包括所有角落案例的完全匹配,请使用

System.IO.Directory.GetFiles(myPath, myPattern)

您可能必须首先在您的目标字符串中创建一些临时文件。

换句话说,我认为您应该保持模式干燥,直到遇到文件系统为止。

答案 2 :(得分:1)

转换*和?正则表达式很容易。
为了?更换 ”?”用“。{1}” 并且*用“。+?”替换“*”

这应该会让你获得与Windows上的通配符匹配相同的行为。

编辑: boolean PathMatchSpec(input, pattern)将完成这项工作。

Private Declare Auto Function PathMatchSpec Lib "shlwapi" (ByVal pszFileParam As String, ByVal pszSpec As String) As Boolean

答案 3 :(得分:1)

你应该采用基于正则表达式的方法,除非你的数据量很大或你有数据点说regex会严重影响性能。

如果是这种情况,任何其他解决方案也可能会影响性能,您可能需要手动滚动。