2012-01-11 23 views
8

Non sono sicuro che le espressioni regolari siano la soluzione migliore qui, ma sembrano abbastanza logiche; Non sono sicuro di come implementarlo.Best practice: corrispondenza parziale con Regex

Fondamentalmente, voglio che il mio utente sia in grado di digitare un nome di metodo e averlo analizzato per la validità dopo ogni immissione di caratteri. Ho definito un formato di funzione valido come regex ed è abbastanza semplice verificare se i due corrispondono. Il guaio è che vorrei essere in grado di eseguire una corrispondenza parziale, in modo da far sapere all'utente: "Finora, questo è valido".

Ad esempio,

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

è un metodo valido. Può essere abbinato a una semplice stringa regolare come

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

. Ma mi piacerebbe essere in grado di avere la stessa stringa regex "match"

+(NSStr 

(che mi rendo conto che è una sorta di cammino a ritroso di utilizzo di espressioni regolari). Non vorrei ancora voglia l'espressione regolare per abbinare

Q)(NStr 

C'è un modo per implementare qualcosa di simile con le funzioni regex standard, oppure avrei dovuto fare qualcosa di più drastico?

Grazie mille! Voi ragazzi siete inestimabili.


Dopo ulteriore riflessione, suppongo avrei potuto fare la mia domanda un po 'più chiaro (così come un po' di più succinta): Normalmente, si utilizza una regex per cercare un modello in testo. In altre parole, quante volte "cat" o "lettino" appaiono in questo paragrafo. Vorrei fare il contrario, cercare una stringa "in" una regex. Cioè, quanta parte di questa stringa, a partire dall'inizio, corrisponde a questa regex. In definitiva, vorrei restituire l'indice in base al quale la stringa smette di corrispondere alla regex in questione.

+0

Sembra che il vostro vero obiettivo è quello di avere una regex per un modello che è sicuramente valida * *, e quindi per innescare un errore quando quel modello è abbinato. Quindi potresti voler confrontare il complemento del linguaggio. Nota che il complemento di una lingua normale può essere o non essere regolare! –

+0

Lungo queste linee, suggerisco di provare a trovare una buona descrizione della grammatica Objective-C (probabilmente una grammatica context-free) e vedere quanto si può confrontare con il complemento della regola di dichiarazione del metodo con regex. –

+0

+1 per una domanda interessante però!:-) –

risposta

1

Punti di aggancio RegexKit per utilizzare PCRE in modo da poter provare a utilizzare direttamente PCRE poiché supporta le corrispondenze parziali.

#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; 
} 

stamperà:

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

vorrei solo scrivere uno script per prendere la regex e dividerlo in modo che la regex ABCD diventa il nuovo regex: ^ (ABCD | ABC | AB | A) $

parentesi sarà difficile quindi evitali se possibile. Altrimenti devi tener conto di ciò probabilmente aggiungendo la giusta quantità di parenti di chiusura. Dovrai anche tokenizzare la stringa ABCD dall'operatore regex in modo da non dividere qualcosa come \ * +