El problema se puede replantear como "¿los idiomas descritos por dos o más expresiones regulares tienen una intersección no vacía"?
Si limitar la cuestión a expresiones puras regulares (no hay referencias hacia atrás, búsqueda hacia delante, de búsqueda hacia atrás, u otras características que permitan el reconocimiento de contexto libre o más complejo idiomas), la pregunta es, al menos, decidible. Los idiomas regulares se cierran bajo la intersección , y hay un algoritmo que toma las dos expresiones regulares como entradas y produce, en un tiempo finito, un DFA que reconoce la intersección.
Cada expresión regular se puede convertir a un autómata finito no determinista, y luego a un autómata finito determinista. Un par de DFA se pueden convertir a un DFA que reconoce la intersección. Si hay una ruta desde el estado de inicio a cualquier estado de aceptación de ese DFA final, la intersección no está vacía (un "conflicto", usando su terminología).
Por desgracia, hay una explosión posiblemente exponencial cuando se convierte la primera NFA a un DFA, por lo que el problema se vuelve rápidamente inviable en la práctica como el tamaño de las expresiones de entrada crece.
Y si se permiten extensiones de expresiones regulares puras, todas las apuestas están desactivadas - tales idiomas ya no se cierran bajo intersección, por lo que esta construcción no funcionará .
Tengo una sospecha furtiva de que este problema es equivalente al problema de detención. –
@Seamus Campbell: ¡Excelente punto! ¿Es este el olor del problema de detención? Si no, ¿cómo se puede implementar? – Tom
Otra forma de pensar sobre esto es ... ¿Por qué no agregas a la expresión regular del usuario haciendo que las expresiones regulares sean mutuamente excluyentes? Es decir Taché al final que no es lo mismo que el anterior ¿Eso ayuda? – MikeG