PDA

View Full Version : [JAVA]Espressioni regolari


Homra
25-11-2008, 10:56
Ciao a tutti,
devo implementare un controllo su una stringa che può avere i seguenti formati_
nnnnnnnnnnnn
nnnnnn/nn/nn
annnnnnnnn

dove n=numero da 0 a 9, a= lettera da 'a' a 'Z'.

Stò provando da ore ad impostare una espressione reoglare da passare al metodo match ma non ottengo alcun rissultato...qualcuno mi può aiutare.

Grazie mille a tutte le anime pie che mi daranno una mano....:help:

gokan
25-11-2008, 11:18
la prima
[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]
la seconda
come la prima, con le barre
la terza, simile alla prima tranne che per la parte iniziale
[a-zAz]...

Così su due piedi mi sono venute queste soluzioni, sicuramente esiste un modo per dirgli di scrivere esattamente dodici cifre con un RE più breve.
Ciao

DanieleC88
25-11-2008, 11:19
Non sono certo un mago delle espressioni regolari, ma mi sa che devi tentare il match con tre pattern diversi, ovvero:
[0-9]\{12\}
[0-9]\{6\}/[0-9]\{2\}/[0-9]\{2\}
[a-zA-Z][0-9]\{9\}

Al limite puoi anche sostituire [a-zA-Z] con [[:alpha:]] e [0-9] con [[:digit:]].

Homra
25-11-2008, 11:29
Non sono certo un mago delle espressioni regolari, ma mi sa che devi tentare il match con tre pattern diversi, ovvero:
[0-9]\{12\}
[0-9]\{6\}/[0-9]\{2\}/[0-9]\{2\}
[a-zA-Z][0-9]\{9\}

Al limite puoi anche sostituire [a-zA-Z] con [[:alpha:]] e [0-9] con [[:digit:]].

e non si possono metter in or i tre pattern?

Homra
25-11-2008, 11:33
ah..mi sono dimenticato di aggiungere che la lunghezza non è costante....

VICIUS
25-11-2008, 11:34
e non si possono metter in or i tre pattern?

Certo. Basta metterli tra parentesi () separati da |.
([\d]{13}|[a-z]|....)

DanieleC88
25-11-2008, 11:35
[0-9]\{12\}\|[0-9]\{6\}/[0-9]\{2\}/[0-9]\{2\}\|[a-zA-Z][0-9]\{9\}

DanieleC88
25-11-2008, 11:37
Certo. Basta metterli tra parentesi () separati da |.
([\d]{13}|[a-z]|....)
Attento, devi fare l'escape della pipe per le espressioni regolari non estese. :D (EDIT: anche se non so come vengano trattate in Java, io solitamente mi affido al buon grep)
ah..mi sono dimenticato di aggiungere che la lunghezza non è costante....
Metti dei limiti minimi o massimi alle ripetizioni o sostituiscile con *.

Homra
25-11-2008, 13:02
Attento, devi fare l'escape della pipe per le espressioni regolari non estese. :D (EDIT: anche se non so come vengano trattate in Java, io solitamente mi affido al buon grep)

Metti dei limiti minimi o massimi alle ripetizioni o sostituiscile con *.

utilizzando * (ignorando lunghezza massima e minima delle sequenze numeriche) la imposterei così:

[0-9]*\|[0-9]*/[0-9]*/[0-9]*\|[a-zA-Z][0-9]*

Cosa ne pensate?

Ovviamente dichiarerei così il tutto:

String regex="[0-9]*\|[0-9]*/[0-9]*/[0-9]*\|[a-zA-Z][0-9]*"
MyString.match(regex)

E' corretto?

Homra
25-11-2008, 13:05
se uso \| ho degli errori quindi proverò con | e basta...

DanieleC88
25-11-2008, 13:09
Se è ciò di cui hai bisogno, allora è ok.

Homra
25-11-2008, 14:11
Grazie mille a tutti siete stati fondamentali... alla fine mi sembrava tutto + complesso di ciò che era in realtà.
Grazie ancora.;)