c# - matches - regular expression creator online
Índice regex en una cadena coincidente donde falló la coincidencia (5)
Me pregunto si es posible extraer la posición del índice en una cadena dada donde falló una Regex al intentar hacerla coincidir.
Por ejemplo, si mi expresión regular era "abc" y traté de unir eso con "abd", la coincidencia fallaría en el índice 2.
Edita para aclaración. La razón por la que necesito esto es para permitirme simplificar el componente de análisis de mi aplicación. La aplicación es una herramienta de enseñanza de idiomas Assmebly que permite a los estudiantes escribir, compilar y ejecutar ensambles como programas.
Actualmente tengo una clase tokenizer que convierte cadenas de entrada en tokens usando regex. Esto funciona muy bien Por ejemplo:
El tokenizer produciría los siguientes tokens con la siguiente entrada = "INP: x:"
:
Token.OPCODE, Token.WHITESPACE, Token.LABEL, Token.EOL
Estos tokens son luego analizados para asegurar que se ajusten a una sintaxis para una declaración dada. Actualmente esto se hace usando declaraciones IF y está resultando engorroso. Lo bueno de este enfoque es que puedo proporcionar mensajes de error detallados. ES DECIR
if(token[2] != Token.LABEL) { throw new SyntaxError("Expected label"); }
Quiero usar una expresión regular para definir una sintaxis en lugar de las molestas declaraciones IF. Pero al hacerlo, pierdo la capacidad de devolver informes de error detallados. Por lo tanto, al menos me gustaría informar al usuario de DONDE ocurrió el error.
Estoy de acuerdo con Colin Younger, no creo que sea posible con la clase Regex existente. Sin embargo, creo que es factible si estás dispuesto a sudar un poco:
- Obtenga el código fuente de la clase Regex (por ejemplo, http://www.codeplex.com/NetMassDownloader para descargar la fuente .Net).
- Cambie el código para tener una propiedad de solo lectura con el índice de falla.
- Asegúrese de que su código use ese Regex en lugar de Microsoft.
No creo que sea posible, pero estoy intrigado por qué lo querrías.
Para hacer eso, necesitaría retrollamadas incrustadas en la expresión regular (que AFAIK C # no admite) o preferiblemente se engancha en el motor de expresiones regulares. Incluso entonces, no está claro qué resultado le gustaría si se tratara de retroceder.
Supongo que ese índice solo tendría sentido en un caso simple, como en tu ejemplo.
Si toma una expresión regular como "ab * c * z" (donde por * quiero decir cualquier carácter) y una cadena "abbbcbbcdd", ¿de qué debería estar hablando el índice? Dependerá del algoritmo utilizado para el cálculo matemático ... Podría fallar en "abbbc ..." o en "abbbcbbc ..."
No es posible saber dónde falla una expresión regular. como resultado, debe adoptar un enfoque diferente. Necesitas comparar cadenas. Use una expresión regular para eliminar todas las cosas que podrían variar y compararla con la cadena que usted sabe que no cambia.
Me encontré con el mismo problema que surgió en tu respuesta y tuve que encontrar mi propia solución. Aquí está:
https://.com/a/11730035/637142
Espero eso ayude