Win32-API für Wildcard-Zeichenfolgenübereinstimmung

8

Ich suche nach einer Wildcard-String-Match-API (keine Regex-Übereinstimmung). Ich kann nichts anderes als Win32-APIs verwenden.

    
user15071 31.07.2009, 21:14
quelle

6 Antworten

10

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

Andernfalls sollten Sie wahrscheinlich mit einer RegEx gehen, wie Pavel ausführlich beschrieben.

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

    
peterchen 31.07.2009 21:53
quelle
6

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

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

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

Fügen Sie eine CriticalSection um den API-Aufruf ein, wenn Ihre App mit mehreren Threads versehen ist!

Ссылка

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

Elmü

    
Elmue 26.06.2013 15:36
quelle
5

Am einfachsten wäre es, Ihr glob-Muster durch folgende Regeln in eine Regex zu konvertieren:

  • * wird .*
  • ? wird .
  • Beliebige von \|.^$+()[]{} werden mit Escapezeichen versehen, indem sie mit \ vorangestellt werden

Das ist teilweise richtig.

Folgende Regeln werden vom DIR-Verhalten in XP + Eingabeaufforderung aufgenommen:
* ist das gleiche wie *.* und wird Regex .+
? wird regex .? , wenn nicht gefolgt von einem Nicht-Platzhalter < br> ? nicht gefolgt von einem Platzhalter wird Regex .
*. bedeutet "ohne Erweiterung" und wird [^.]+$

    
Pavel Minaev 31.07.2009 21:36
quelle
3

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

Sie können nichts außer Win32 verwenden? 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 erledigt werden kann.

edit: Erste Google-Übereinstimmung ist der PHP-Code:

Ссылка

    
Tim Sylvester 31.07.2009 21:19
quelle
3

Wenn Sie nach einem einfachen Platzhaltervergleich ( globbing ) suchen, haben einige Leute ihre eigenen geschrieben einschließlich dieses (das wir in unserem Code verwenden)

    
Alan 31.07.2009 21:59
quelle
0

Was genau ist Ihre Anforderung? Möchten Sie nur das Symbol '' verwenden, um 0 oder mehr Zeichen zuzuordnen, oder planen Sie die Verwendung des '?' Symbol auch. Wenn es nur '' ist, müssen Sie nach a, a , b, a b * c usw. Muster suchen? Wenn Ihre Anforderung begrenzt ist, können Sie problemlos mit der STRST-Funktion der C ++ - Laufzeitbibliothek arbeiten.

    
msvcyc 31.07.2009 21:32
quelle

Tags und Links