Win32 API для сопоставления строк с подстановочными знаками - PullRequest
9 голосов
/ 01 августа 2009

Я ищу API совпадения строк с подстановочными знаками (не совпадение с регулярным выражением). Я не могу использовать ничего, кроме Win32 API.

Ответы [ 6 ]

10 голосов
/ 01 августа 2009

Существует PathMatchSpec - но обработка файлов является специализированной, поэтому результаты могут отличаться от ожидаемых, если вам нужно общее сопоставление с подстановочными знаками.

В противном случае, вы, вероятно, должны использовать RegEx, как подробно описал Павел.

[править] Я неправильно предположил PathMatchSpec разделяет свойства FindFirstFile / FindNextFile . Я провел несколько тестов - это не так. Так что, похоже, лучший кандидат.

6 голосов
/ 26 июня 2013

Странно, что прошло столько лет, и никто не дал вам такой ответ:

Существует WIN32 API, который делает именно то, что вы ищете. (Я нашел его в поиске в MSDN "подстановочный знак")

Это имя SymMatchString(). Он находится в DbgHelp.dll, который является частью операционной системы.

Поместите CriticalSection вокруг вызова API, если ваше приложение является многопоточным!

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

API, который FindFirstFile() использует внутренне для подстановочных совпадений, вероятно FsRtlIsNameInExpression().

Elmü

5 голосов
/ 01 августа 2009

Самое простое - просто преобразовать шаблон глобуса в регулярное выражение по следующим правилам:

  • * становится .*
  • ? становится .
  • Любой из \|.^$+()[]{} экранируется, если им предшествует \

Это отчасти верно.

Из поведения DIR в командной строке XP + вытекают следующие правила:
* совпадает с *.* и становится регулярным выражением .+
? становится регулярным выражением .?, если за ним не следует подстановочный знак
? без подстановочного знака становится регулярным выражением .
*. означает «без расширения» и становится [^.]+$

4 голосов
/ 01 августа 2009

Если вы после простого сравнения с подстановочными знаками ( globbing ), некоторые люди написали свои собственные, в том числе этот (который мы используем в нашем коде)

3 голосов
/ 01 августа 2009

API FindFirstFile и FindNextFile выполняют подстановочные сопоставления, но только для имен файлов.

Вы не можете использовать что-нибудь , кроме Win32? А как насчет STL или CRT? Вы используете Boost?

Без ограничения Win32 API я бы рекомендовал использовать код из какого-либо проекта с открытым исходным кодом. Другой вариант - перевести глобус в регулярное выражение, что, я думаю, можно сделать с помощью операции замены регулярного выражения.

edit: первое совпадение Google - это код PHP:

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

0 голосов
/ 01 августа 2009

Что именно ваше требование? Вы просто хотите использовать символ '' для соответствия 0 или более символам или планируете использовать символ '?' символ также. Если это просто '', нужно ли искать шаблоны типов a, , a b, a b * c и т. Д.? Если ваши требования ограничены, вы можете легко обойтись без функции strstr библиотеки времени выполнения C ++.

...