2009-07-31 14 views
8

Estoy buscando una API de coincidencia de cadena comodín (no coincidencia de expresión regular). No puedo usar nada más que las API de Win32.Win32 API para hacer coincidencia de cadena comodín

+1

¿Qué quieres decir con "wildcard string match"? Por favor, den ejemplos. –

+1

Ejemplos o (preferiblemente) una especificación. Si te refieres a reglas idénticas para presentar comodines en Windows, pero no lo dices explícitamente, entonces normalmente Neil presionará para obtener un mejor documento de requisitos ;-) Además, se me ocurre que '*' y '?' En el archivo globs don No coincide con el carácter de barra diagonal inversa: podría afectar la respuesta, ya sea que desee o no este comportamiento. –

Respuesta

3

Las API FindFirstFile y FindNextFile hacen coincidencias con comodines, pero solo con nombres de archivos.

No se puede usar nada pero Win32? ¿Qué hay de STL o CRT? ¿Estás usando Boost?

Sin la restricción API de Win32, recomendaría usar el código de algún proyecto de código abierto. Otra opción sería traducir el glob en una expresión regular, lo que creo que se puede hacer con una operación de regex regex.

edición: Primera Google partido es el código PHP:

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

0

¿qué es exactamente sus necesidades? ¿Está buscando utilizar el símbolo '' para que coincida con 0 o más caracteres o planea utilizar el '?' símbolo también. Si solo es '', ¿necesita buscar a,, b, b * c, etc. patrones de tipo? Si su requerimiento es limitado, puede salirse fácilmente con la función strstr de la biblioteca de tiempo de ejecución de C++.

5

Lo más fácil sería simplemente convertir su patrón global de una expresión regular, por las siguientes reglas:

  • * se convierte en .*
  • ? convierte .
  • Cualquiera de \|.^$+()[]{} hayan escapado precediendolas con \

Esto es parcialmente cierto.

siguientes reglas son inducidos a partir del comportamiento DIR en el símbolo XP + Comando:
* es lo mismo que *.* y se convierte en expresiones regulares .+
? se convierte en expresiones regulares .? menos que sea seguida por un no-comodín
? No seguida de un comodín se convierte en expresiones regulares .
*. significa "sin extensión", y se convierte en [^.]+$

9

Hay PathMatchSpec - pero la manipulación está especializado en archivos, por lo que es posible que los resultados no sean los esperados si necesita una coincidencia de comodines general.

De lo contrario, probablemente debería ir con un RegEx, como Pavel detallado.

[editar] I incorrectamente supone PathMatchSpec comparte las propiedades de FindFirstFile/FindNextFile. He realizado algunas pruebas, pero no es así. Entonces parece el mejor candidato.

+0

Un hallazgo muy interesante. Sin embargo, me pregunto cómo es que esa cosa está especializada en caminos (si es que realmente lo es). –

+0

Pavel, comprobé: el manejo especial solo se encuentra en FindFirst/NextFile. ¡Hurra! : D – peterchen

+0

¿Cuál es el manejo especial? No veo por qué no sería lo mismo? ¿Quiere decir que se aplica a la parte del nombre del archivo solo en FindFirst/NextFile? – paulm

3

Si lo que busca es un simple comodín comparar (globbing), algunas personas han escrito su propia, incluyendo this one (que utilizamos en nuestro código)

6

extraño que tantos años pasaron y nadie te dieron esta respuesta :

Hay una API WIN32 que hace exactamente lo que estás buscando. (Lo encontré buscando en el MSDN para "comodín")

Su nombre es SymMatchString(). Se sienta en DbgHelp.dll que es parte del sistema operativo.

¡Ponga una CriticalSection alrededor de la llamada API si su aplicación es multiproceso!

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

La API que utiliza internamente para FindFirstFile() comodín coincide es probablemente FsRtlIsNameInExpression().

Elmü

+0

DbgHelp puede ser parte del sistema operativo. Desafortunadamente, MS tiene esto que decir: "Aunque esta DLL está incluida en todas las versiones compatibles de Windows, rara vez es la versión más actual de DbgHelp disponible. Además, la versión de DbgHelp que se envía en Windows tiene una funcionalidad reducida de las otras versiones. - Específicamente, carece de soporte para Symbol Server y Source Server. "Personalmente, no me sentiría especialmente cómodo al implementar una solución que use esta API bajo tales condiciones. –

+0

¿Cuántas aplicaciones se ejecutarán en SymbolServer o SourceServer? Si realmente te preocupas, podrías instalar una versión conocida de DbgHelp.dll en la carpeta de tu programa y esta se cargará en lugar de la DLL del sistema operativo. – Elmue