2009-07-31 112 views
8

我正在寻找通配符字符串匹配API(不是正则表达式匹配)。我不能使用Win32 API以外的其他任何东西。执行通配符字符串匹配的Win32 API

+1

你是什么意思的“通配符字符串匹配”?请举例。 – 2009-07-31 21:31:38

+1

示例或(最好)规范。如果你的意思是在Windows上使用相同的规则来存档通配符,但是没有明确地说出来,那么通常Neil会按下一个更好的需求文档;-)另外,我发现文件中的`*`和`?不匹配反斜线字符 - 它可能会影响您是否需要此行为的答案。 – 2009-07-31 21:52:26

回答

3

FindFirstFileFindNextFile的API做通配符匹配,但只针对文件名。

不能使用任何的Win32?那么STL或CRT呢?你在使用Boost吗?

没有Win32 API限制,我会建议使用某些开源项目的代码。另一种选择是将glob转换为正则表达式,我相信这可以通过正则表达式替换操作来完成。

编辑:一是谷歌比赛是PHP代码:

http://cvs.php.net/viewvc.cgi/php-src/win32/

0

究竟是你的要求吗?你只是想使用''符号来匹配0或更多的字符,或者你打算使用'?'符号也是如此。如果它仅仅是 '',你需要寻找一个,一个,一个B,A B * C等类型的模式?如果你的需求是有限的,你可以轻松脱离C++运行时库的strstr函数。

5

最简单的事情将只是你的glob模式转换为正则表达式,按以下规则:

  • *成为.*
  • ?成为.
  • 任何\|.^$+()[]{}它们之前被转义与\

这是部分正确的。

以下规则从DIR行为XP +命令提示符引导:
*相同*.*,成为正则表达式.+
?除非后跟一个非通配符后面没有通配符
?成为正则表达式变成正则表达式.?.
*.意味着 “没有扩展名”,并成为[^.]+$

9

PathMatchSpec - 但处理是专门用于文件的,所以如果你需要一般的通配符匹配,结果可能不是你所期望的。

否则,您应该使用正则表达式,因为帕维尔详细。

[编辑]错误地假定PathMatchSpecFindFirstFile/FindNextFile属性。我已经跑了一些测试 - 它没有。所以它看起来是最好的候选人。

+0

一个非常有趣的发现。我想知道如何专门为路径,但(如果它实际上是)。 – 2009-07-31 22:01:31

3

如果你简单的通配符后是比较(globbing),有些人已经写自己的,包括this one(这是我们在代码中使用)

6

奇怪的是,这么多年过去了,没人给你这个答案:

有一个WIN32 API,完全符合你的要求。 (我发现它在MSDN中搜索“通配符”)

它的名字是SymMatchString()。它位于操作系统的一部分DbgHelp.dll中。

如果您的应用程序是mulithreaded,请在API调用中添加CriticalSection!

http://msdn.microsoft.com/en-us/library/windows/desktop/ms681355%28v=vs.85%29.aspx

FindFirstFile()内部使用通配符的API相匹配可能是FsRtlIsNameInExpression()

Elmü