Slashmc
10-03-2011, 00:14
Ciao a tutti, vi espongo brevemente il mio problema: ho la necessita' di trovare, all'interno di una Stringa contenente un testo, una determinata parola e di far visualizzare le N parole precedenti e le N parole successive alla parola cercata.
Ho pensato di risolvere questo problema con una regex ma probabilmente sbaglio qualcosa...
Vi riporto qui di seguito il mio codice spiegandovi la mia idea:
Ho creato una funzione che presa la parola da cercare e il numero di parole antecedenti e successive da far visualizzare crea la regex:
/**
* Crea la regex per la ricerca della parola all'interno della Stringa
* @param s: parola da ricercare nella Stringa
* @param n: Numero di parole antecedenti e successive alla parola data
* @return Regex per la ricerca
*/
public String createRegex(String s, int n){
String res = new String();
String before = new String("[a-zA-Z0-9'!\"()-_]+[\\s+|!|\"|'|(|)]+");
String after = new String("[\\s+|!|\"|'|(|)]+[a-zA-Z0-9'!\"()-_]+");
for(int i=0; i<n;i++){
res+=before;
}
res+=s;
for(int i=0; i<n;i++){
res+=after;
}
System.out.println("Regex: "+res);
return res;
}
Un esempio di regex prodotta da questa funzione (con s=occhi e n=2) sarebbe:
[a-zA-Z0-9'!"()-_]+[\s+|!|"|'|(|)]?+[a-zA-Z0-9'!"()-_]+[\s+|!|"|'|(|)]+occhi[\s+|!|"|'|(|)]?+[a-zA-Z0-9'!"()-_]+[\s+|!|"|'|(|)]+[a-zA-Z0-9'!"()-_]+
Questa funzione viene appunto richiamata prima di effettuare la find nella stringa:
String regex = createRegex(word, nWord);
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(res);
while(matcher.find()){
String foundedWord =matcher.group();
output.add(foundedWord);
}
dove res e' la Stringa in cui effettuare la richiesta e output e' un Vector di String cosi' definito: Vector<String> output = new Vector<String>();
Purtroppo questo mio approccio va incontro a numerosi problemi in quanto ho riscontrato dei casi in cui la ricerca della parola non va a buon fine.
Ad esempio se la Stringa fosse: "Codifica automaticamente i link nel testo", la parola da ricercare fosse "automaticamente" e il numero di parole precedenti e successive da far visualizzare fosse "4", la regex non ritorna nessuna corrispondenza in quanto non riesce a prendere le 4 parole precedenti a automaticamente (in quanto ve ne sono solo due)....
Potreste suggerirmi una regex corretta per effettuare questa operazione e potreste indicarmi cortesemente l'errore presente nella regex da me sviluppata?
Spero di essere stato abbastanza chiaro...Grazie per l'eventuale aiuto!
Ho pensato di risolvere questo problema con una regex ma probabilmente sbaglio qualcosa...
Vi riporto qui di seguito il mio codice spiegandovi la mia idea:
Ho creato una funzione che presa la parola da cercare e il numero di parole antecedenti e successive da far visualizzare crea la regex:
/**
* Crea la regex per la ricerca della parola all'interno della Stringa
* @param s: parola da ricercare nella Stringa
* @param n: Numero di parole antecedenti e successive alla parola data
* @return Regex per la ricerca
*/
public String createRegex(String s, int n){
String res = new String();
String before = new String("[a-zA-Z0-9'!\"()-_]+[\\s+|!|\"|'|(|)]+");
String after = new String("[\\s+|!|\"|'|(|)]+[a-zA-Z0-9'!\"()-_]+");
for(int i=0; i<n;i++){
res+=before;
}
res+=s;
for(int i=0; i<n;i++){
res+=after;
}
System.out.println("Regex: "+res);
return res;
}
Un esempio di regex prodotta da questa funzione (con s=occhi e n=2) sarebbe:
[a-zA-Z0-9'!"()-_]+[\s+|!|"|'|(|)]?+[a-zA-Z0-9'!"()-_]+[\s+|!|"|'|(|)]+occhi[\s+|!|"|'|(|)]?+[a-zA-Z0-9'!"()-_]+[\s+|!|"|'|(|)]+[a-zA-Z0-9'!"()-_]+
Questa funzione viene appunto richiamata prima di effettuare la find nella stringa:
String regex = createRegex(word, nWord);
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(res);
while(matcher.find()){
String foundedWord =matcher.group();
output.add(foundedWord);
}
dove res e' la Stringa in cui effettuare la richiesta e output e' un Vector di String cosi' definito: Vector<String> output = new Vector<String>();
Purtroppo questo mio approccio va incontro a numerosi problemi in quanto ho riscontrato dei casi in cui la ricerca della parola non va a buon fine.
Ad esempio se la Stringa fosse: "Codifica automaticamente i link nel testo", la parola da ricercare fosse "automaticamente" e il numero di parole precedenti e successive da far visualizzare fosse "4", la regex non ritorna nessuna corrispondenza in quanto non riesce a prendere le 4 parole precedenti a automaticamente (in quanto ve ne sono solo due)....
Potreste suggerirmi una regex corretta per effettuare questa operazione e potreste indicarmi cortesemente l'errore presente nella regex da me sviluppata?
Spero di essere stato abbastanza chiaro...Grazie per l'eventuale aiuto!