Newsgroup: it.comp.java
Titolo: StringBuffer e parsing

Ciao.
Devo sviluppare un'applicazione e ho bisogno di scorrere una stringa e
separare il suo contenuto in altre stringhe.
Ovvero:
ho una stringa fatta in questa maniera: data = inizio+dati1+separatore
+dati2+separatore+dati3+finedati.
I separatori e le sottostringhe di inizio e fine sono una sequenza di
caratteri da me definita.
Ho provato ad usare uno StringBuffer, copiandoci il contenuto della
stringa per usare i metodi indexOf etc etc per trovare i separatori.
Il problema è che mi perdo negli indici e mi trovo sempre con un
errore del tipo String index out of range.
Riesco a separare la stringa da dati1 a dati3 in questa maniera:
StringBuffer sb = new StringBuffer(data);
String dati = sb.substring(sb.lastIndexOf(inizio)+inizio.length(),
sb.indexOf(finedati));
Poi, da un nuovo stringBuffer fatto con dati, mi perdo e non riesco
più a togliere i separatori con lo stesso meccanismo di prima.
C'è un modo pi semplice per fare la stessa cosa? Oppure dove sbaglio?

StringTokenizer st = new StringTokenizer(<stringa da analizzare>,
<stringa dei separatori>*, <restituire i separatori?>);
<stringa da analizzare> <- non mi sembra che servano spiegazioni
<stringa dei separatori> <- di default la stringa dei separatori è "\n
\s\t" e simili quindi se tu vuoi che la stringa viene spezzata ad ogni
lettera 'a' o 'b' utilizza "ab"
<restituire i separatori> <- di default false, se lo imposti a true
next Token() ti restituisce la stringa puntata che termina con il
carattere di separazione che ha incontrato
st.hasMoreToken() -> true se ci sono altre stringhe, altrimenti false
st.nextToken() -> restituisce la stringa che punta attualmente e punta
alla successiva
l'unica cosa è che non puoi tornare indietro cioè se invochi il metodo
nextToken() e poi vuoi tornare al token che tiu ha restituito non
puoi...
Spero di essere stato chiaro, nel caso in cui non lo fossi stato ti
rimando alle care e sempre utili API di JAVA (
http://java.sun.com/j2se/
1.5.0/docs/api/)
ti ho passato quelle di java 5 perchè sono le prime che ho trovato con
google....
Ciao Marco


Grazie per la risposta. Solo una cosa non ho capito: il separatore, se
ho capito bene, è un carattere che compare nella stringa che si passa
come secondo parametro del costruttore. Se io volessi separare con una
sequenza precisa di caratteri? O mi conviene usare un carattere
speciale come appunto \n e soci?


E' solo per capire meglio, ho usato uno dei separatori che mi avevi
detto e va benissimo. Grazie ancora per la risposta.


La classe StringTokenizer è deprecated... dovresti usare il metodo
split(String) associato alla stringa, indicando come parametro il
separatore.
String s = new String();
s.split("\n");
Se invece usi classi come StringBuffer o StringBuilder allora prima di
fare la split, dovresti invocare il metodo toString(), e
successivamente utilizzare la split

 s.split("\n");
Ciao,
il parametro del metodo split è una regular expression, quindi per 
dividere usando il carattere di a capo, bisogna fare l'escape del 
backslash. Inoltre restituisce i token in un array di stringhe:
String[] tokens = s.split("\\n");
-- 
Lucio Benfante
JUG Padova           
http://www.parancoe.org
 ...have a look at it!
www.jugpadova.it