PDA

View Full Version : [Regex] Prendere una qualunque sequenza di caratteri compresa tra due delimitatori


Xfree
30-06-2011, 13:03
Ciao a tutti.
Avrei bisogno di una mano per la creazione di una espressione regolare.
Ho una lista di stringhe tra cui devo riuscire a prendere una qualunque sequenza di caratteri compresa tra due caratteri delimitatori.
Il seguente codice mostra un esempio eterogeneo di quello che mi ritrovo.


, 432/1 Sc. L -
, 67 -
, 350/2P. -
, 60/. -
, 56/2P Int. 4 -
, 17/2 P -
, 66/P/T Int. 4 -
, 526/2 P -
, 24 Int. 1 -


Quello che vorrei fare è riuscire a prendere ciò che è compreso tra i due caratteri delimitatori virgola e trattino.
Il problema è che ciò che è compreso tra i due delimitatori è scritto in modo eterogeneo.
Io ci ho provato ma, probabilmente a causa della mia non approfondita conoscenza delle espressioni regolari, non ci sono riuscito.
Ho ovviato scrivendo tante espressioni regolari per i vari casi possibili che si sono sono presentati analizzando il file, ma ciò penso sia lungo e controproducente.
Questo è quanto ho fatto, ancora in fase di rifinitura.

[,]\\s*(\\w+|\\w+[/]\\w+|\\w+[/]\\w+[.]\\w+|\\w+[/]\\w+[/]\\w+)*\\s[\\-]

Non fate caso ai \\ perché il motore di regex del programma che sto usando necessita questo accorgimento.
Quello che mi chiedo e che è alla fine la domanda del thread :
esiste un modo per prendere una qualunque sequenza di caratteri, compatibile con il set che mi ritrovo, compresa tra due delimitatori riuscendo a scrivere meno codice possibile?
Grazie anticipatamente a chi avrà la pazienza di leggere e sarà in grado di aiutarmi.

SerMagnus
30-06-2011, 13:29
se ti interessa solo il contenuto testuale potrebbe bastare anche la seguente regex (nn testata)

,(.*)-

wingman87
30-06-2011, 13:41
Se ho capito bene forse andrebbe bene una cosa di questo tipo:
(?<=,).*?(?=-)
Con (?<=,) matchi (permettimi il termine) la virgola ma non la catturi.
Con .*? selezioni qualunque carattere (grazie al punto), zero o più volte (grazie all'asterisco) e in modo lazy (grazie al ?).
Con (?=-) matchi il trattino ma non lo catturi.

Per lazy si intende che il match viene interrotto a favore dell'elemento successivo, in questo caso il trattino. Ad esempio
, asd - , lol -
in modo lazy catturi " asd ", in modo non lazy (o greedy) catturi " asd - , lol ".

Ho usato come riferimento questo (http://www.regular-expressions.info) sito e in particolare:
LINK (http://www.regular-expressions.info/reference.html)
LINK (http://www.regular-expressions.info/refadv.html)

Xfree
30-06-2011, 14:31
Innanzitutto grazie ad entrambi per la risposta.
Subito dopo aver postato, sono andato a cercare delle informazioni ed avevo scritto per prova una regex così formata


[?<=\\,](\\d+)[?=\\-]


senza però ottenere il risultato sperato.
Adesso provo con entrambi i suggerimenti.
Grazie ancora.

Xfree
30-06-2011, 14:43
Bene, di funzionare funzionano entrambe.
Ora devo capire il problema per cui non viene matchato alcun campo se aggiungo quell'espressione regolare al resto che ho già creato.
Almeno è un passo avanti e so per certo, grazie a voi, che quello funziona.
Grazie ancora per l'aiuto.