Newsgroup: it.comp.java
Titolo: Exception in thread "main" java.util.regex.PatternSyntaxException: Unclosed character class

Ciao a tutti,
ho un'espressione regolare che mi genera questa eccezione:
Exception in thread "main" java.util.regex.PatternSyntaxException:
Unclosed character class  near index 81:
^(\w\S)+([[]@)(\w*)(>|<|>=|<=|=|<>|!=|==)\S?(\w+)\S?[]]\s*(AND|OR|NOT)*\s*(\w\S)*$
       ^
C'è qualche errore?
Grazie!
--
Vinci

 writes:
V> Ciao a tutti, ho un'espressione regolare che mi genera questa
V> eccezione:
V> Exception in thread "main" java.util.regex.PatternSyntaxException:
V> Unclosed character class near index 81:
V> ^(\w\S)+([[]@)(\w*)(>|<|>=|<=|=|<>|!=|==)\S?(\w+)\S?[]]\s*(AND|OR|NOT)*\s*(\w\S)*$
 
Le  regexp  sono  brutte  bestioline,  in  primis  perché  ci  sono  N
implementazioni, quella del Perl, quella di Emacs etc.
Partiamo dall'errore riportato per capire cosa non va in quella che ti
da problemi.
"Unclosed character class"
Ricontrollando un attimo il javadoc della classe (è quello che fa fede
per l'implementazione delle regexp in Java) direi che
        [[]@)(\w*)(>|<|>=|<=|=|<>|!=|==)\S?(\w+)\S?[]]
non è una character class valida, quindi le character classes possibili
sono
        [[] e []]
Ora, anche io ero abituato alla sintassi (Emacs) che prevede l'uso di 
[[] per fare il match con [ ; per fare il match con ] non occorre la 
character class (sempre in Emacs).
Nella documentazione comunque non si fa cenno a [[] per fare il match
con [ ma si parla di backslash.
Ho fatto  dei test sulla correttezza  sintattica, ma non  ho provato a
decifrare la  regexp - tendono  ad essere write  only - quindi  non so
quali sono le stringhe con cui deve fare il match.
La  cosa sicura è  che non  gli piace  [[] per  indicare il  match con
[. Prova a vedere se \[ funziona.
E direi  anche che  []] mon  fa il match  con ]  ma con  "classe vuota
seguita da ]".
-- 
 /\            ___
/___/\__|_|\_|__|___Gian Uberto Lauri_____________________
  //--\ | | \|  |   Integralista GNUslamico  
\/		    e allevatore di bug da competizione

Dunque, ho provato ad sostituire \[ al posto di [[] e \] al posto di
[]] però ottengo questo errore già in compilazione..
illegal escape character
        Pattern pattern =
Pattern.compile("^(\\w\\S)+(\[@)(\\w*)(>|<|>=|<=|=|<>|!=|==)\\S?(\\w+)\\S?\]\\s*(AND|OR|NOT)*\\s*(\\w\\S)*");
                  ^
./checkCredentials.java:37: illegal escape character
        Pattern pattern =
Pattern.compile("^(\\w\\S)+(\[@)(\\w*)(>|<|>=|<=|=|<>|!=|==)\\S?(\\w+)\\S?\]\\s*(AND|OR|NOT)*\\s*(\\w\\S)*");
                  ^
2 errors
Ho provato anche a utilizzare \p, come indicato nella documentazione,
ma non funziona..
--
Vinci

 writes:
V> Dunque, ho provato ad sostituire \[ al posto di [[] e \] al posto
V> di []] però ottengo questo errore già in compilazione..
V> illegal escape character ...
Possiamo pensare che la compilazione di una regexp con Pattern avvenga in
due passi.
Nel  primo si  "elaborano" gli  escape character,  ovvero  le sequenze
\(qualcosa). Le sequenze \(qualcosa)  valide per Java sono solo alcune
e  ben documentate,  \[  e \]  non  sono escape  character validi.  La
convenzione  di Java sugli  escape character  prevede che,  qualora si
abbia  bisogno del  carattere  backslash, questo  vada sostituito  con
l'escape character \\.
Nel resto della tua regexp, come dimostra questo pezzetto
V> ^(\\w\\S)+(\[@)(\\w*
hai correttamente utilizzato \\ dappertutto fuorché prima di [, quindi
Pattern.compile() sostituisce correttamente i  primi 2 \\ (ottenendo i
simboli speciali per la regexp \w  e \S), va in errore su \[, prosegue
tranquilla fintanto che non rivà  errore su \]
Se tu invece di  \] e \[ usi \\] e \\[  la regexp viene generata senza
errori a runtime.


 errori a runtime.
Sì, ora gli errori a runtime non sono più presenti, però non viene
validata un'espressione di questo tipo: secretary[@level='14'] .
La nuova regexp è questa:
"^(\\w\\S)+(\\[\\@)(\\w*)(>|<|>=|<=|=|<>|!=|==)\\S?(\\w+)\\S?\\]\\s*(AND|OR|NOT)*\\s*(\\w\\S)*"
E' corretto il pattern relativo alla @ ?

 writes:
Scusa il ritardo nella risposta...
V> La nuova regexp è questa:
V> "^(\\w\\S)+(\\[\\@)(\\w*)(>|<|>=|<=|=|<>|!=|==)\\S?(\\w+)\\S?\\]\\s*(AND|OR|NOT)*\\s*(\\w\\S)*"
V> E' corretto il pattern relativo alla @ ?
Dovrebbe andare bene, anche se @ non mi pare abbia significati speciali.
Ho qualche dubbio sullo (\w\S)+ che è una sequenza di questo tipo
\w\S\w\S\w\S ...
che non mi pare  l'unione tra \w e \S necessari per  fare il match con
secretary[@level='14'] ?
