Autore Topic: Espressione regolare  (Letto 663 volte)

Offline Melanogaster

  • Utente normale
  • ***
  • Post: 260
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    SII
  • Sistema operativo:
    Kubuntu
Espressione regolare
« il: 11 Luglio 2013, 10:49:09 CEST »
0
Ciao a tutti,
sto trovando un po' di difficolta' nell'uso delle regexp in Java in quanto non capisco cosa sto sbagliando.
Premetto che solitamente, un po' a tentativi, la regexp che mi occorre la azzecco sempre, ma questa volta a causa di { } non riesco proprio a venirne a capo.

Il codice in cui la uso e' questo:
Codice: [Seleziona]
Pattern pattern                =        Pattern.compile( "(.*)\\\\{(.*)\\\\}" );
Matcher matcher                =        pattern.matcher( campo );
tipoCampo                        =        matcher.group( 0 );
corpoCampo                        =        matcher.group( 1 );

L'espressione regolare
Codice: [Seleziona]
(.*)\{(.*)\}dovrebbe essere scritta per riconoscere stringhe tipo questa:
Citazione
NomeCampo{"CorpoCampo1", "CorpoCampo2"}

Il problema e' che se la regexp la lascio cosi' mi da errore Eclipse, se ci metto il doppio \\ non mi trova (No successful match so far) nulla la regexp, se ne metto 4 mi restituisce errore di sintassi (Syntax error U_REGEX_BAD_INTERVAL near index 8 - indicando il secondo . dentro le parentesi).

Sapreste dirmi come come dovrei fare?
Grazie in anticipo :)

PS: qualcuno che usa linux sa consigliarmi qualche programmino per scrivere e testare regexp? Attualmente su kde mi servo della funzione Cerca di Kwrite ma non e' che sia il massimo della comodita'... :-P
« Ultima modifica: 11 Luglio 2013, 11:15:45 CEST da Melanogaster »

Offline theBaffo

  • Utente normale
  • ***
  • Post: 164
  • Respect: +24
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Windows 8.1
Re:Espressione regolare
« Risposta #1 il: 11 Luglio 2013, 11:15:27 CEST »
0
Posta l'errore, così magari riusciamo a capire cosa non và  :-) (intanto dai un occhiata qui)
Se ti sono stato utile, premi "thanks" ;)

"Errare è umano, ma per incasinare davvero tutto è necessario un computer" - Arthur Bloch

Offline Melanogaster

  • Utente normale
  • ***
  • Post: 260
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    SII
  • Sistema operativo:
    Kubuntu
Re:Espressione regolare
« Risposta #2 il: 11 Luglio 2013, 11:37:08 CEST »
0
Postati entrambi gli errori modificando il primo messaggio ;)

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Espressione regolare
« Risposta #3 il: 11 Luglio 2013, 11:52:24 CEST »
+1
Hai messo troppi  backslash, non inizializzi la ricerca e sbagli a leggere i gruppi.

Questo è il codice corretto:

Codice (Java): [Seleziona]
static final Pattern pattern = Pattern.compile("(.*)\\{(.*)\\}");

....

Matcher matcher = pattern.matcher(campo);

if (matcher.find()) {

        String tipoCampo  = matcher.group(1);
        String corpoCampo = matcher.group(2);
}

La compilazione della regular expression è meglio metterla in un campo statico in modo da eseguirla una volta sola. I caratteri backslash non si devono mai sbagliare, non è Eclipse che segnala errore ma è il compilatore, Eclipse lo riporta soltanto. Se non lanci il metodo "find" non resetti lo stato interno e non puoi prelevare i gruppi individuati. Il gruppo 0 è quello di tutta la stringa di partenza, i gruppi individuati partono da 1.

Prova questi programmi: "redet", "visual-regexp",  "kiki".



adb logcat | tee /tmp/logcat | grep TAG

Offline Melanogaster

  • Utente normale
  • ***
  • Post: 260
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    SII
  • Sistema operativo:
    Kubuntu
Re:Espressione regolare
« Risposta #4 il: 11 Luglio 2013, 12:00:32 CEST »
0
Preciso puntuale e.estremamente didattico!
Grazie mille ice, ora provo subito.
Vuoi vedere poi che ho imparato pure a dichiarare la regexp static e ottimizzare il codice? :)

Una domanda però...il problema quindi era 'solo' nel lanciare il find()?
Perché in origine avevo messo pure io solo due backslash ma credendo fosse lì l'errore li ho raddoppiati ignorantemente

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Espressione regolare
« Risposta #5 il: 11 Luglio 2013, 12:12:17 CEST »
0
Se non è statica ma dentro a un metodo perdi il vantaggio della compilazione, utilizzi più memoria e impieghi più tempo. Se non usi "find" appena accedi ai grupi lancia una eccezione particolare sullo stato interno dell'oggetto diversa rispetto a una espressione regolare non valida o altro.
adb logcat | tee /tmp/logcat | grep TAG