Win32 API用于进行通配符字符串匹配

时间:2009-07-31 21:14:27

标签: c++ c winapi wildcard glob

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

6 个答案:

答案 0 :(得分:10)

PathMatchSpec - 但处理专门针对文件,因此如果您需要通用通配符匹配,结果可能不是您所期望的。

否则,您应该使用RegEx,就像Pavel详细说明一样。

<强> [编辑] 错误地假设PathMatchSpec共享FindFirstFile/FindNextFile的属性。我跑过几次测试 - 但事实并非如此。所以看起来它是最好的候选人。

答案 1 :(得分:6)

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

有一个WIN32 API可以完全满足您的需求。 (我发现它在MSDN中搜索“通配符”)

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

如果您的应用是多线程的,请在API调用周围放置一个CriticalSection!

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

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

Elmü

答案 2 :(得分:5)

最简单的方法是将您的glob模式转换为正则表达式,遵循以下规则:

  • *变为.*
  • ?变为.
  • 通过\|.^$+()[]{}
  • 前面的任何\进行转义

部分正确。

以下规则是从XP +命令提示符中的DIR行为导入的:
**.*相同,并成为正则表达式.+ ?成为正则表达式.?,除非后跟非通配符 ?后面没有通配符变为正则表达式.
*.表示“无延期”,并变为[^.]+$

答案 3 :(得分:4)

如果您正在进行简单的通配符比较(globbing),则有些人已经编写了自己的通配符,包括this one(我们在代码中使用)

答案 4 :(得分:3)

FindFirstFileFindNextFile API执行通配符匹配,但仅针对文件名。

您不能使用任何但Win32? STL或CRT怎么样?你在使用Boost吗?

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

编辑:首先谷歌匹配是PHP代码:

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

答案 5 :(得分:0)

您的要求到底是什么?您是否只想使用''符号匹配0个或更多字符,或者您打算使用'?'符号也是。如果只是'',您是否需要查找 a, b, b * c等类型模式?如果您的要求有限,您可以轻松地使用C ++运行时库的strstr函数。