¿Cómo podría uno eficientemente hacer coincidir una cadena de entrada con cualquier cantidad de expresiones regulares?¿Cómo hacer coincidir eficientemente una cadena de entrada con varias expresiones regulares a la vez?
Un escenario donde esto podría ser útil es con los servicios web REST. Vamos a suponer que he llegado con una serie de patrones de URL para la interfaz pública de un servicio web REST:
/user/with-id/
{userId}
/user/with-id/
{userId}
/profile
/user/with-id/
{userId}
/preferences
/users
/users/who-signed-up-on/
{date}
/users/who-signed-up-between/
{fromDate}
/and/
{toDate}
- ...
donde {…}
se denominan marcadores de posición (como grupos de captura de la expresión regulares).
Nota: Esta pregunta no es si la interfaz REST anterior está bien diseñado o no. (Probablemente no es, pero eso no debería importar en el contexto de esta pregunta.)
Se puede suponer que los marcadores de posición por lo general no aparecen en el comienzo de un patrón (pero podrían) También se puede suponer con seguridad que es imposible que una cadena concuerde con más de un patrón.
Ahora el servicio web recibe una solicitud. Por supuesto, uno podría hacer coincidir secuencialmente el URI solicitado con un patrón de URL, luego con el siguiente, y así sucesivamente; pero eso probablemente no se escalará bien para un mayor número de patrones que deben verificarse.
¿Existen algoritmos eficientes para esto?
Entradas:
- una cadena de entrada
- un conjunto de expresiones regulares "mutuamente excluyentes" (es decir, sin cadena de entrada puede coincidir con más de una expresión.)
de salida :
- La expresión regular (si existe) con la que coincide la cadena de entrada.
¿Existe una implementación en C++ de eso por casualidad? – nurettin
http://en.wikipedia.org/wiki/Aho%E2%80%93Corasick_string_matching_algorithm tiene enlaces a algunas implementaciones. Recuerdo que http://sourceforge.net/projects/snort/ tenía una implementación en C en alguna parte, pero eso fue hace muchos años, podría estar equivocado. –
Encontré que la biblioteca de google re2 puede coincidir con las expresiones regulares usando el algoritmo Aho-Corasick – nurettin