2012-01-11 26 views
8

No estoy seguro de que las expresiones regulares sean la mejor solución aquí, pero parecen lo suficientemente lógicas; Simplemente no estoy seguro de cómo implementar esto realmente.Mejor práctica: coincidencia parcial de Regex

Básicamente, deseo que mi usuario pueda escribir un nombre de método y hacer que se analice su validez después de cada entrada de caracteres. He definido un formato de función válido como expresión regular, y es bastante fácil probar si los dos coinciden. El problema es que me gustaría poder hacer una coincidencia parcial, para que el usuario sepa: "Hasta ahora, esto es válido".

Por ejemplo,

+(NSString *)thisIsAValid:(ObjectiveC *)method; 

es un método válido. Puede combinarse con una cadena de expresiones regulares simples como

[\+-]\(w+\s*\*?\)\w+....etc... 

. Pero me gustaría ser capaz de tener esa misma expresión regular "partido"

+(NSStr 

(lo que me di cuenta es una especie de camino hacia atrás de la utilización de expresiones regulares). Todavía no querría que la expresión regular para que coincida con

Q)(NStr 

¿Hay una manera de implementar algo como esto con las funciones de expresiones regulares estándar, o tendría que hacer algo más drástico?

¡Muchas gracias! Ustedes son invaluables.


Después de un nuevo pensamiento, supongo que podría hacer mi pregunta un poco más claro (así como un poco más sucinta): Normalmente, se utiliza una expresión regular para buscar un modelo de texto. Es decir, ¿cuántas veces aparece "cat" o "cot" en este párrafo? Deseo hacer lo contrario, buscar una cadena "en" una expresión regular. Es decir, cuánto de esta cadena, comenzando desde el principio coincide con esta expresión regular. En última instancia, me gustaría devolver el índice en el que la cadena deja de coincidir con la expresión regular en cuestión.

+0

Parece que su verdadero objetivo es tener una expresión regular para un patrón que es * * definitivamente no válido, y luego a desencadenar un error cuando ese patrón se compara. Por lo tanto, es posible que desee buscar la coincidencia del complemento del idioma. Tenga en cuenta que el complemento de un idioma regular puede o no ser regular. –

+0

En ese sentido, sugiero tratar de encontrar una buena descripción de la gramática de Objective-C (probablemente una gramática libre de contexto) y ver cuánto puede coincidir con el complemento de la regla de declaración de método con regex. –

+0

+1 para una pregunta interesante!:-) –

Respuesta

1

RegexKit tiene que usar PCRE para intentar usar PCRE directamente, ya que admite coincidencias parciales.

#include <stdio.h> 
#include <pcre.h> 

void test_match(pcre *re, char *subject); 

void test_match(pcre *re, char *subject) { 
    int rc = pcre_exec(re, NULL, subject, (int)strlen(subject), 
        0, PCRE_PARTIAL, NULL, 0); 
    printf("%s: %s\n", subject, 
     rc == 0 || rc == PCRE_ERROR_PARTIAL ? 
     "match or partial" : "no match"); 
} 

int main (int argc, const char * argv[]) { 
    pcre *re; 
    const char *errstr; 
    int erroffset; 

    re = pcre_compile("^ABC$", 0, &errstr, &erroffset, NULL); 
    test_match(re, "A"); 
    test_match(re, "AB"); 
    test_match(re, "ABC"); 
    test_match(re, "ABD"); 

    return 0; 
} 

imprimirá:

A: match or partial 
AB: match or partial 
ABC: match or partial 
ABD: no match 
0

me acaba de escribir un guión para tomar la expresión regular, que se dividió de manera que la expresión regular ABCD se convierte en la nueva expresión regular: ^ (ABCD | ABC | AB | A) $

Paréntesis será complicado así que evítales si es posible. De lo contrario, debes contabilizar eso probablemente agregando la cantidad correcta de parens de cierre. También deberá tokenizar la cadena ABCD con el operador de expresiones regulares para no dividir algo como \ * +