2012-01-12 48 views
4

我正在寻找一种简单而强大的方法来实现Windows风格的*?通配符在字符串中匹配。寻找简单但功能强大的windows通配符(`*,?`)匹配实现

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

想要一个快乐的媒介。

编辑:我试图解析.gitignore文件,并匹配相同的文件,因为Git。这意味着:

  • 文件应该是出库的索引(所以我检查存储在索引对一个文件的路径)
  • .gitignore数的模式可以很大;
  • 要检查的文件数量可能也很大。
+3

非常含糊。发布一些具有所需输出的输入。 – 2012-01-12 21:25:09

+1

@亨克,大多数窗口的人会知道什么意思,*任何数量的字符,?只是一个未知的字符...?blah * .txt会匹配任何与之前的字符的任何东西,任何数量的字符后,等等,并以.txt结尾 – 2012-01-12 21:29:49

+0

@HenkHolterman,我解析'.gitignore'文件,并在我的库我需要达到原始Git提供的相同行为。 – shytikov 2012-01-12 21:37:32

回答

4

的Windows等同通配符?和正则表达式*只是..*


[编辑]鉴于你的新的编辑(认为你正在寻找实际文件),我会完全跳过翻译,让.NET进行使用Directory.GetFiles()搜索。

(注意,出于某种原因,路过一个?Directory.GetFiles()比赛“零个或一个字符,” 而在Windows中,它总是匹配一个字符)

+0

个人意见,我不喜欢这个想法转化为正则表达式。因为很多东西也需要翻译。例如点,大括号,他们需要逃脱。而且我不能保证用户输入他们的通配符是准确的。这使得方法变得复杂。 – shytikov 2012-01-12 21:39:07

+4

编写自己的模式匹配比翻译为正则表达式要复杂得多。 – CodesInChaos 2012-01-12 21:45:19

+1

@Alexey:请参阅[Regex.Escape()](http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.escape.aspx) – 2012-01-12 21:53:08

1

转换*和?正则表达式很容易。
对于?更换 ”?”与“。{1}” ,并*用“。+?”替换“*”

这应该会得到与Windows上通配符匹配相同的行为。编辑: boolean PathMatchSpec(input, pattern)将完成这项工作。

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

是的,这很容易,但是有没有其他方法可以将一种模式转换为另一种模式? – shytikov 2012-01-12 21:33:50

+3

您还需要转义在正则表达式中具有特殊含义的字符。 – CodesInChaos 2012-01-12 21:36:14

+0

好点@CodeInChaos – 2012-01-12 21:37:57

1

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

如果是这样的话,任何其他解决方案也有可能影响性能,你可能会需要手工卷的东西。

2

要获得包括所有角落的情况下精确匹配,使用

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

您可能需要创建一些临时文件第一次形成的targetstrings。

换句话说,我认为你应该让你的模式干,直到它的时间,以满足filesytem。

+0

对我而言,这几乎没用,因为我以您的方式获取文件夹中的所有文件指出,比我检查Git索引中有多少人。在剩下的文件中,我搜索这些与'.gitignore'中的模式不匹配的文件。 – shytikov 2012-01-13 07:50:21