【问题标题】:Win32 API to do wildcard string matchWin32 API 做通配符字符串匹配
【发布时间】:2009-07-31 21:14:27
【问题描述】:

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

【问题讨论】:

  • 你所说的“通配符字符串匹配”是什么意思?请举例说明。
  • 示例或(最好)规范。如果您的意思是与 Windows 上的文件通配符相同的规则,但没有明确说明,那么通常 Neil 会要求提供更好的要求文档;-) 另外,我想到文件 glob 中的 *? 不' 不匹配反斜杠字符 - 无论您是否想要这种行为,它都可能影响答案。

标签: c++ c winapi wildcard glob


【解决方案1】:

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

否则,您可能应该使用正则表达式,正如 Pavel 所详述的那样。

[编辑]错误地假设PathMatchSpec 共享FindFirstFile/FindNextFile 的属性。我已经进行了一些测试 - 它没有。所以它看起来是最好的候选人。

【讨论】:

  • 一个非常有趣的发现。不过,我想知道那个东西是如何专门用于路径的(如果确实如此的话)。
  • Pavel,我检查过 - 特殊处理仅在 FindFirst/NextFile 中。耶! :D
  • 有什么特殊处理?我不明白为什么会不一样?您的意思是它仅适用于 FindFirst/NextFile 中的文件名部分?
  • @paulm:另一件事是匹配例如如果启用了 8.3 名称,则将 x.htm 转换为 *.html。 blogs.msdn.com/b/oldnewthing/archive/2005/07/20/440918.aspx
【解决方案2】:

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

有一个 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()

埃尔穆

【讨论】:

  • DbgHelp 可能是操作系统的一部分。不幸的是,MS 有这样的说法:“Although this DLL is included in all supported versions of Windows, it is rarely the most current version of DbgHelp available. Furthermore, the version of DbgHelp that ships in Windows has reduced functionality from the other releases-- specifically, it lacks support for Symbol Server and Source Server.”就我个人而言,在这种情况下使用此 API 部署解决方案我不会觉得特别舒服。
  • 要在 SymbolServer 或 SourceServer 上运行多少个应用程序?如果您真的担心可以将已知版本的 DbgHelp.dll 安装到程序的文件夹中,它将被加载而不是操作系统的 DLL。
【解决方案3】:

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

  • * 变为 .*
  • ? 变为 .
  • \|.^$+()[]{} 中的任何一个都可以通过在它们前面加上\ 进行转义

这部分是正确的。

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

【讨论】:

    【解决方案4】:

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

    除了 Win32,你不能使用 任何东西? STL 或 CRT 呢?你在使用 Boost 吗?

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

    编辑:第一个谷歌匹配是 PHP 代码:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        您的具体要求是什么?您只是想使用 '' 符号来匹配 0 个或更多字符,还是打算使用 '?符号也是。如果只是'',是否需要寻找a、a、ab、ab*c等类型模式?如果您的要求有限,您可以轻松摆脱 C++ 运行时库的 strstr 函数。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-09-04
          • 1970-01-01
          • 2015-07-29
          • 1970-01-01
          • 1970-01-01
          • 2018-01-01
          • 1970-01-01
          • 2017-10-28
          相关资源
          最近更新 更多