我正在寻找简单而强大的方法来实现在字符串中匹配的Windows风格的*
和?
通配符。
BeginsWith()
,EndsWith()
过于简单,无法涵盖所有情况,而将通配符表达式转换为正则表达式看起来很复杂,而且我不确定性能。
想要一个快乐的媒体。
编辑:我正在尝试解析.gitignore
文件并匹配相同的文件,就像Git一样。这意味着:
.gitignore
中的模式数量可能很大; 答案 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会严重影响性能。
如果是这种情况,任何其他解决方案也可能会影响性能,您可能需要手动滚动。