2008-09-20 25 views
7

Me pregunto si es posible extraer la posición del índice en una cadena dada donde falló una Regex al intentar hacer coincidirla?Índice regex en una cadena coincidente donde falló la coincidencia

Por ejemplo, si mi expresión regular era "abc" y yo intentó igualar eso con "abd" el partido fallaría al índice 2.

Editar una 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 utilizando expresiones regulares. Esto funciona muy bien Por ejemplo:

El tokenizer produciría los siguientes tokens les da la siguiente entrada = "INP: x:"
:

Token.OPCODE, Token.WHITESPACE, Token.LABEL, Token.EOL 

Estas fichas se analizan a continuación, para asegurar que se ajustan 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. I.E

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.

+0

Me interesaría saber si esto realmente resultó más fácil. Al no haber mirado nunca el código de un compilador, creo que el código que genera sus mensajes de error a menudo se parece mucho al suyo. – harpo

+0

Al final decidí continuar con las declaraciones IF. Sin embargo, eliminé las declaraciones de IF reales de las clases de Statement derivadas y en su lugar puse un método CheckSyntax() en mi clase Statement base, que hizo la excepción IF checking/throwing. Esto me permitió eliminar una gran cantidad de duplicación de código. –

Respuesta

4

Estoy de acuerdo con Colin Younger, no creo que sea posible con la clase Regex existente. Sin embargo, creo que es factible si usted está dispuesto a sudar un poco:

  1. obtener el código fuente de la clase Regex (por ejemplo http://www.codeplex.com/NetMassDownloader para descargar la fuente .Net).
  2. Cambie el código para tener una propiedad de solo lectura con el índice de falla.
  3. Asegúrese de que su código usa ese Regex en lugar de Microsoft.
1

Supongo que un índice de este tipo solo tendría sentido en algunos casos simples, como en su 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? Será dependen del algoritmo utilizado para mathcing ... podría fallar en "abbbc ..." o en "abbbcbbc ..."

+0

Me gustaría que el primer índice vaya de izquierda a derecha. En su ejemplo, creo que "abbbcbbcdd" coincidiría bien hasta el punto donde la expresión regular requiere un carácter 'z'. –

0

no creo que es posible, pero estoy intrigado por las que se lo quiero.

+0

Agregué un breve resumen en mi pregunta sobre por qué. Saludos por tu respuesta –

0

Para hacer eso, necesitaría retrollamadas incrustadas en la expresión regular (que AFAIK C# no admite) o preferiblemente se engancha en el motor regex. Incluso entonces, no está claro qué resultado le gustaría si se tratara de retroceder.

0

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 surgió a su respuesta y tuve que encontrar mi propia solución. Aquí está:

https://stackoverflow.com/a/11730035/637142

creo que sirve

Cuestiones relacionadas