2009-07-31 7 views
8

Ich bin auf der Suche nach einer Wildcard-String-Match-API (nicht Regex-Übereinstimmung). Ich kann nichts anderes als Win32-APIs verwenden.Win32 API zu Wildcard-String-Match

+1

Was meinen Sie mit "Wildcard String Match"? Bitte geben Sie Beispiele. –

+1

Beispiele oder (vorzugsweise) eine Spezifikation. Wenn du identische Regeln zum Platzieren von Wildcards unter Windows meinst, aber nicht explizit sagst, dann drückt Neil normalerweise auf einen besseren Anforderungs-Doc ;-) Außerdem fällt mir auf, dass '*' und '?' In Datei-Globs nicht vorkommen passen Sie nicht den umgekehrten Schrägstrich an - es könnte die Antwort beeinflussen, ob Sie dieses Verhalten möchten oder nicht. –

Antwort

3

Die APIs FindFirstFile und FindNextFile führen Wildcard-Übereinstimmungen aus, aber nur gegen Dateinamen.

Sie können nichts verwenden aber Win32? Was ist mit STL oder CRT? Benutzt du Boost?

Ohne die Win32-API-Einschränkung würde ich empfehlen, den Code aus einem Open-Source-Projekt zu verwenden. Eine andere Option wäre, den Glob in eine Regex zu übersetzen, was meiner Meinung nach mit einer Regex-Ersetzungsoperation durchgeführt werden kann.

bearbeiten: Erst Google Spiel ist der PHP-Code:

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

0

Was genau ist Ihre Anforderung? Möchten Sie nur das Symbol '' verwenden, um 0 oder mehr Zeichen zu finden, oder haben Sie vor, das '?' Symbol auch. Wenn es nur '' ist, müssen Sie nach a,, b, b * c, etc Muster suchen? Wenn Ihre Anforderung begrenzt ist, können Sie problemlos mit der strstr-Funktion der C++ - Laufzeitbibliothek arbeiten.

5

wäre die einfachste Sache zu einfach Ihre glob Muster auf einen regulären Ausdruck umwandeln, durch die folgenden Regeln:

  • * wird .*
  • ?. von
  • Jedes \|.^$+()[]{} sind entkommen wird sie vorhergehenden mit \

Dies ist teilweise richtig.

Folgende Regeln sind von DIR Verhalten in XP + Eingabeaufforderung eingeführt:
* die gleiche wie *.* ist und wird regex .+
?.? regex wird, es sei denn
? nicht wird durch eine Wildcard, gefolgt von einem Nicht-Wildcard gefolgt regex .
*. bedeutet "ohne Verlängerung", und wird [^.]+$

9

Es PathMatchSpec ist - aber Handhabung ist auf Dateien spezialisiert, daher sind die Ergebnisse möglicherweise nicht das, was Sie erwarten, wenn Sie einen allgemeinen Wildcard-Abgleich benötigen.

Ansonsten sollten Sie wahrscheinlich mit einer RegEx gehen, wie Pavel detailliert.

[Bearbeiten] I falsch angenommen PathMatchSpec Aktien die Eigenschaften von FindFirstFile/FindNextFile. Ich habe ein paar Tests durchgeführt - das tut es nicht. Es sieht also nach dem besten Kandidaten aus.

+0

Ein sehr interessanter Fund. Ich frage mich, wie sich dieses Ding auf Pfade spezialisiert hat (wenn es tatsächlich so ist). –

+0

Pavel, ich habe überprüft - die spezielle Handhabung ist nur in FindFirst/NextFile. Yay! : D – peterchen

+0

Was ist das spezielle Handling? Ich verstehe nicht, warum es nicht so sein würde. Sie meinen, es gilt für den Dateinamen nur in FindFirst/NextFile? – paulm

3

Wenn Sie nach einem einfachen Wildcard sind vergleichen (globbing), haben einige Leute ihre eigenen geschrieben, darunter this one (die wir in unserem Code verwenden)

6

Seltsam, dass so viele Jahre vergangen, und niemand hat Ihnen diese Antwort :

Es gibt eine WIN32 API, die genau das tut, wonach Sie suchen. (Ich fand es in der MSDN Suche nach "Wildcard")

Es ist der Name ist SymMatchString(). Es befindet sich in DbgHelp.dll, die Teil des Betriebssystems ist.

Setzen Sie einen CriticalSection um den API-Aufruf, wenn Ihre App Multithread ist!

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

Die API, die FindFirstFile() intern für Wildcard verwendet Spiele ist wahrscheinlich FsRtlIsNameInExpression().

Elmü

+0

DbgHelp möglicherweise Teil des Betriebssystems. Leider hat MS folgendes zu sagen: "Obwohl diese DLL in allen unterstützten Versionen von Windows enthalten ist, ist sie selten die aktuellste Version von DbgHelp. Außerdem hat die Version von DbgHelp, die in Windows ausgeliefert wird, die Funktionalität der anderen Versionen reduziert - Es fehlt insbesondere die Unterstützung für Symbol Server und Source Server. "Ich persönlich würde mich nicht besonders wohl dabei fühlen, eine Lösung mit dieser API unter solchen Bedingungen zu implementieren. –

+0

Wie viele Anwendungen sollen auf SymbolServer oder SourceServer laufen? Wenn Sie sich darüber Sorgen machen, können Sie eine bekannte Version von DbgHelp.dll in Ihrem Programmordner installieren und diese wird anstelle der DLL des Betriebssystems geladen. – Elmue