View Full Version : [Java] Espressioni Regolari
Checco83
03-12-2009, 19:14
Ciao a tutti! Ancora una volta ho bisogno di un vostro aiuto!!:sofico:
Il mio problema è questo : ho un file di testo contenente una stringa per riga; vorrei poter fare in modo che TUTTE queste stringhe terminino con " ;" (spazio seguito dal punto e virgola senza le virgolette)...
quindi se ho qualcosa del tipo :
select * from users deve diventare select * from users ;
Leggendo un po' su Internet mi pare di aver capito che potrei usare delle espressioni regolari, ma sinceramente documentandomi un po' c'ho capito veramente poco.
P.S. prima del ; finale deve essere presente un solo spazio, quindi se la stringa termina con uno spazio bisogna aggiungere solo il ; alla fine
Grazie Mille :)
Le espressioni regolari sono l'anticamera dell'alcolismo, se non devi cercare pattern complessi è meglio evitarle.
Se ho la stringa:
String line = "select * from users"
e dico:
line = line + " ;"
la stringa diventa:
"select * from users ;"
Se la stringa termina con uno spazio aggiungi solo ";" sarebbe:
if(line.endsWith(" ")) {
line += ";";
} else {
line += " ;";
}
(line += x) vale come (line = line + x).
Viene da chiedersi se la linea possa terminare con più di uno spazio, tipo:
"select * from "
Qui l'if non va più bene.
Opzione 1, "trim". Il metodo trim degli String elimina gli spazi all'inizio e alla fine della stringa:
line = line.trim() + " ;"
garantisce che la linea termini sempre e solo con uno spazio e un punto e virgola, tagliano eventuali spazi iniziali.
Se vuoi preservare gli spazi iniziali passi al "fai da te":
while(line.endsWith(" ")) line = line.substring(0, line.length() - 1);
line += " ;";
Questo funziona come il precedente ma lascia eventuali spazi iniziali.
Insomma, c'è di che sbizzarrirsi.
bottomap
03-12-2009, 20:03
Ciao,
Forse ho letto di fretta e mi sfugge qualche dettaglio specifico, ma una:
if(!line.endsWith(";"))
line+=";";
Iterata su tutte le linee del file non sarebbe un po'più pratica?
Ciaociao :)
banryu79
04-12-2009, 10:39
Ciao,
Forse ho letto di fretta e mi sfugge qualche dettaglio specifico, ma una:
if(!line.endsWith(";"))
line+=";";
Iterata su tutte le linee del file non sarebbe un po'più pratica?
Ciaociao :)
Sarebbe più pratica ma non soddiferebbe tutti i requisiti.
In particolare non aggiungerebbe il carattere di spazio prima del ";", come invece richiesto dall'utente.
Checco83
04-12-2009, 11:00
Innanzitutto grazie mille per le risposte, siete gentilissimi!!
Ho risolto, almeno spero, quasi tutti i problemi con il vostro aiuto solo che ne ho ancora uno:doh:
Se ho una stringa del tipo :
Select * from utenti;
in base a quanto scritto mi verrebbe aggiunto il " ;" alla fine ottenendo quindi
Select * from utenti; ;
Quello che vorrei ottenere,invece, è Select * from utenti ;
quindi praticamente dire che ogni qualvolta ho una stringa che termina con un qualsiasi carattere subito seguito dal ; deve aggiungermi uno spazio prima del ; ...E' possibile fare questo?! (Ditemi di si vi prego!!!:( )
Ancora grazie mille
Posta il codice interessato così si aggiusta quello, altrimenti ti continuano ad arrivare nuove soluzioni.
Ad ogni modo se la tua stringa è s, in questo caso specifico
s = s.trim();
if(s.endWith(";"))
s = s.substring(0, s.length()-2) + " ;";
Può andare? :stordita:
bottomap
04-12-2009, 11:41
Ah, ecco... mi ero perso qualcosa, ma in questo caso:
if(!line.endsWith(";")){
if(!line.endsWith(" ")){
line+=" ";
}
line+=";";
}
Se già finisce con ; non viene toccata
Se finisce con spazio viene aggiunto il solo ;
Se finisce in qualsiasi altro modo viene aggiunto spazio e ;
Ciaociao :)
Checco83
04-12-2009, 12:13
Ho fugato ogni mio dubbio!! Grazie mille ancora!!!:)
banryu79
04-12-2009, 13:50
Ah, ecco... mi ero perso qualcosa, ma in questo caso:
if(!line.endsWith(";")){
if(!line.endsWith(" ")){
line+=" ";
}
line+=";";
}
Se già finisce con ; non viene toccata
Se finisce con spazio viene aggiunto il solo ;
Se finisce in qualsiasi altro modo viene aggiunto spazio e ;
Il tuo algoritmo va bene solo se abbiamo la garanzia che le stringhe in input siano sempre terminate al massimo da un solo carattere di spazio.
Cioè questa:
"select * from users "
verrebbe così:
"select * from users ;"
e non va bene perchè l'utente voleva uno e un solo spazio prima del ";".
bottomap
04-12-2009, 14:01
Mmmm...
Mi pare che non fosse tra le ipotesi, altrimenti se finisce con ; ma contiene più spazi prima dello stesso andrebbe ripulita?
Ipotizziamo comunque una terza versione (supponendo di non avere problemi con gli spazi in testa, altrimenti basta rifarsi una trimRight):
line=line.trim(); //si levano gli spazi in coda
if(!line.endsWith(";")){
line+=" ;";
}
Se termina con ; vengono eventualmente eliminati gli spazi dopo il ;
Se termina con uno o più spazi vengono tolti tutti ed aggiunto " ;"
Se termina in altro modo viene aggiunto " ;"
Se si vuole ripulire anche gli eventuali spazi di troppo basterà aggiungere il ramo else, prendere la sottostringa fino al ;, trimmarla e procedere come sopra aggiungendo il " ;".
Ciaociao :)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.