En informática , un algoritmo para la coincidencia de comodines (también conocido como globbing ) es útil para comparar cadenas de texto que pueden contener sintaxis de comodines . [ 1 ] Los usos comunes de estos algoritmos incluyen interfaces de línea de comandos , por ejemplo, el shell Bourne [ 2 ] o la línea de comandos de Microsoft Windows [ 3 ] o editores de texto o administradores de archivos, así como las interfaces de algunos motores de búsqueda [ 4 ] y bases de datos. [ 5 ] La coincidencia de comodines es un subconjunto del problema de la coincidencia de expresiones regulares y la coincidencia de cadenas en general. [ 6 ]
El problema
Un comparador de comodines prueba un patrón de comodín p contra una cadena de entrada s . Realiza una coincidencia anclada y devuelve verdadero solo cuando p coincide con la totalidad de s .
El patrón puede basarse en cualquier sintaxis común (ver globbing ), pero en Windows los programadores tienden a discutir solo una sintaxis simplificada compatible con el entorno de ejecución nativo de C: [ 7 ] [ 8 ]
- No se han definido caracteres de escape.
- Comodines:
?coincide exactamente con una aparición de cualquier carácter.*coincide con un número arbitrario de apariciones (incluidas cero) de cualquier carácter.
Este artículo trata principalmente sobre la formulación del problema en el contexto de Windows, a menos que se indique lo contrario.
Definición
El problema de coincidencia de comodines, expresado en índices basados en cero, se puede definir recursivamente como:
donde m ij es el resultado de comparar el patrón p con el texto t truncado en i y j caracteres respectivamente. Esta es la formulación utilizada por el algoritmo de Richter y el algoritmo Snippets que se encuentra en la colección de Cantatore. [ 9 ] [ 10 ] Esta descripción es similar a la distancia de Levenshtein .
Problemas relacionados
Entre los problemas directamente relacionados en informática se incluyen:
- Coincidencia de patrones con no importa o huecos, una búsqueda de cadena no anclada con solo el equivalente de
?definido. [ 11 ] [ 12 ] - Coincidencia de patrones con comodines, una búsqueda de cadena sin anclaje con el equivalente de ambos comodines definidos. Tiene un tiempo de ejecución exponencial a menos que se especifique un límite de longitud en la variante de coincidencia de patrones con comodines flexibles. [ 13 ]
Historia
Los primeros algoritmos para la coincidencia de comodines a menudo recurrían a la recursión , pero esta técnica fue criticada por su rendimiento [ 10 ] y fiabilidad [ 8 ] . Los algoritmos no recursivos para la coincidencia de comodines han ganado popularidad a raíz de estas consideraciones.
Tanto en los algoritmos recursivos como en los no recursivos, las estrategias para realizar la búsqueda de patrones varían considerablemente, como se evidencia en los diversos ejemplos de algoritmos que se mencionan a continuación. Se ha demostrado que las técnicas de desarrollo de casos de prueba y optimización del rendimiento se aplican a ciertos algoritmos, en particular a los desarrollados por los críticos de los algoritmos recursivos.
Algoritmos recursivos
La recursión generalmente ocurre al realizar coincidencias *cuando hay más sufijos con los que comparar. Esta es una forma de retroceso , que también utilizan algunos comparadores de expresiones regulares.
- Algoritmo wildmat de Rich Salz (sintaxis tipo sh) [ 14 ]
- Algoritmo de Filip [ 15 ] y algoritmo de Vignesh Murugesan [ 16 ]
- El algoritmo de Martin Richter [ 9 ] (idéntico a Snippets y relacionado con el algoritmo 7-zip) [ 17 ]
- Implementaciones de la biblioteca C fnmatch
[...](admite conjuntos de caracteres multibyte):- fnmatch de la libc de BSD de Guido van Rossum , [ 18 ] también forma parte de la libc de Apple [ 19 ]
- Glibc fnmatch [ 20 ]
La forma general de estos algoritmos es la misma. En la recursión, el algoritmo divide la entrada en subcadenas y considera que hay coincidencia cuando UNA de las subcadenas devuelve una coincidencia positiva. Para dowild("*X", "abcX"), llamaría de forma voraz a , dowild("X", "abcX")y . Suelen diferir en aspectos menos importantes, como la compatibilidad con características, y en factores más importantes, como optimizaciones menores pero muy efectivas. Algunas de ellas incluyen:dowild("X", "bcX")dowild("X", "cX")dowild("X", "X")
- The ABORT signal against over-recursion (Lars Mathiesen 1991). While it is correct to naively recurse by the entire rest of the strings (pattern and text) on
*and making sure that ONE of the substrings return a positive match, the running time becomes exponential for rejecting a match with many*in the text. Lars Mathiesen changes the return to three classes, match, no-match, and ABORT (no match possible at all for asterisk recursion.) The ABORT value is returned when the text is consumed too early or when another asterisk match has failed, guaranteeing a linear performance with respect to the number of asterisks. (The overall complexity is additionally quadratic to the number of characters left to match.)[14] Git/Rsync's wildmatch ABORT also covers invalid inputs.[21] The new INN uwildmat does the same.[22] - Asterisk advancement in recursion. This wildmatch tweak is relatively more minor. It applies to when the recursion wants to match "*X" on "abcX": when an asterisk is followed by a literal like "X", it is obvious that only the last comparison with equal lengths would have a chance of producing a match.[21] This is seen earlier in uwildmat in 2000[22] and more implicitly in van Rossum's fnmatch for
FNM_PATHNAME.
Martin Richter's algorithm is an exception to this pattern, although the overall operation is equivalent. On * it recurses into increasing either of the indexes, following the dynamic programming formulation of the problem. The "ABORT" technique is applicable to it as well.[9] On typical patterns (as tested by Cantatore) it is slower than the greedy-call implementations.[10]
The recursive algorithms are in general easier to reason about, and with the ABORT modification they perform acceptably in terms of worst-case complexity. On strings without * they take linear-to-string-size time to match since there is a fixed one-to-one relation.
Non-recursive algorithms
The following are developed by critics of the recursive algorithms:
- Kirk J. Krauss's wildcard-matching algorithm, used by IBM[8][23]
- Alessandro Cantatore's collection of wildcard matching algorithms[10]
- Dogan Kurt's iterative matcher and slower NFA matcher.[17]
- Siler's incorrect algorithm (fails
MATCH("da*da*da*", "daaadabadmanda"))[24]
The following is not:
- El algoritmo incorrecto de Jack Handy [ 25 ] (falla
MATCH("*?", "xx"))
Las funciones iterativas anteriores implementan el retroceso guardando un conjunto anterior de punteros de patrón/texto y volviendo a él si no hay coincidencia. Según Kurt, dado que solo se requiere una coincidencia exitosa, solo es necesario guardar un conjunto de este tipo. [ 17 ]
Además, el problema de la coincidencia de comodines se puede convertir en una coincidencia de expresiones regulares utilizando un enfoque ingenuo de reemplazo de texto . Aunque los comparadores de expresiones regulares no recursivos como la construcción de Thompson se utilizan menos en la práctica debido a la falta de soporte de retroreferencia, la coincidencia de comodines en general no viene con un conjunto de características igualmente rico. (De hecho, muchos de los algoritmos anteriores solo tienen soporte para ?y *.) La implementación de Russ Cox del NFA de Thompson se puede modificar trivialmente para tal. [ 26 ] El algoritmo nrgrep basado en BDM de Gustavo Navarro proporciona una implementación más optimizada con énfasis en sufijos eficientes. [ 27 ] Véase también expresiones regulares § Implementaciones .
Véase también
Referencias
- ↑ "Caracteres comodín" . ScienceDirect . 2018. Archivado del original el 27 de mayo de 2018. Consultado el 9 de mayo de 2018 .
- ↑ Quigley, Ellie (2005). Introducción rápida a la programación de shells de UNIX . InformIT.com.
- ↑ "Caracteres comodín de MS-DOS y Windows" . Biblioteca de la Red de Desarrolladores de Microsoft . 31 de mayo de 2018.
- ↑ "Apache Lucene - Sintaxis del analizador de consultas" . Documentación de Apache Lucene 2.9.4. 2006.
- ↑ "Comodines SQL" . W3Schools . 2018.
- ↑ Goyvaerts, Jan (2018). "Bienvenido a Regular-Expressions.info" . RegularExpressions.info.
- ↑ "Expansión de comodines" . docs.microsoft.com . 8 de febrero de 2022.
- 1 2 3 Krauss, Kirk (2008). "Matching Wildcards: An Algorithm" . Dr. Dobb's Journal .
- 1 2 3 Interbloqueo (2015). "Algoritmo recursivo de coincidencia de comodines C++" . Stack Overflow .
- 1 2 3 4 Cantatore, Alessandro (2003). "Algoritmos de coincidencia con comodines" .
- ↑ Iliopoulos, Costas S.; Rahman, M. Sohel (2007). "Algoritmos de coincidencia de patrones con 'No importa'" (PDF) . SOFSEM 2007: Teoría y práctica de la informática, 33.ª Conferencia sobre tendencias actuales en teoría y práctica de la informática . Harrachov, República Checa. S2CID 14538871. Archivado del original (PDF) el 17 de diciembre de 2019.
- ↑ Clifford, Peter; Clifford, Raphaël (enero de 2007). "Coincidencia simple determinista con comodines". Information Processing Letters . 101 (2): 53– 54. doi : 10.1016/j.ipl.2006.08.002 .
- ↑ Wu, Xindong; Qiang, Ji-Peng; Xie, Fei (12 de septiembre de 2014). "Coincidencia de patrones con comodines flexibles". Journal of Computer Science and Technology . 29 (5): 740– 750. doi : 10.1007/s11390-014-1464-3 . S2CID 16824910 .
- ^ Salz , rico (1991). "salvajemat.c" . GitHub .
- ↑ Filip (2014). "Comparar cadenas con comodines" . Stack Overflow .
- ↑ Murugesan, Vignesh (2014). "Algoritmo de coincidencia de comodines" .
- 1 2 3 Kurt, Dogan. "Métodos de coincidencia con comodines" .
- ↑ van Rossum, Guido (20 de noviembre de 2019). "freebsd/lib/libc/gen/fnmatch.c" . GitHub . Consultado el 21 de noviembre de 2019 .
- ↑ "fnmatch.c" . opensource.apple.com. 1999.
- ↑ "fnmatch_internal.c" . Espejos de Beren Minor. 21 de noviembre de 2019.
- 1 2 "git/git: wildmatch.c" . GitHub . 2020-01-20.
- 1 2 "uwildmat.c en trunk/lib – INN" . inn.eyrie.org . Consultado el 27 de noviembre de 2019 .
- ↑ Krauss, Kirk (2018). "Matching Wildcards: An Improved Algorithm for Big Data" . Develop for Performance.
- ↑ Siler (2013). "Soluciones recursivas para la coincidencia de patrones glob" . Stack Overflow .
- ↑ Handy, Jack (2005). "Comparación de cadenas con comodines (globbing)" . Code Project .
- ↑ Cox, Ross. "La coincidencia de expresiones regulares puede ser simple y rápida" .
- ↑ Navarro, Gonzalo (10 de noviembre de 2001). "NR-grep: una herramienta de coincidencia de patrones rápida y flexible" (PDF) . Software: Practice and Experience . 31 (13): 1265– 1312. doi : 10.1002/spe.411 . S2CID 3175806 .
- formatos de archivos informáticos
- Comandos informáticos
- Historia de la interacción humano-computadora
- Coincidencia de patrones
- Arquitectura de software
- Técnicas de interfaz de usuario
- Interfaces de usuario