Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 09-03-2011, 23:14   #1
Slashmc
Junior Member
 
Iscritto dal: Mar 2009
Messaggi: 7
[JAVA]Ricerca sottostringa con n parole antecedenti e successive

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!
Slashmc è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2011, 10:47   #2
Slashmc
Junior Member
 
Iscritto dal: Mar 2009
Messaggi: 7
Nessuno e' in grado di darmi una mano?
Slashmc è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2011, 10:52   #3
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da Slashmc Guarda i messaggi
Nessuno e' in grado di darmi una mano?
E' proprio neccessario/conveniente usare le regex per risolvere questo problema?
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2011, 11:02   #4
Slashmc
Junior Member
 
Iscritto dal: Mar 2009
Messaggi: 7
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
E' proprio neccessario/conveniente usare le regex per risolvere questo problema?
Ciao grazie per la risposta!
No non ho vincoli a riguardo...pensavo potesse essere l'approccio migliore per risolvere questo tipo di problema...ma ad essere sincero non ho mai usato le espressioni regolari in precedenza e quindi magari ho una visione errata del loro utilizzo...tu come risolveresti questo problema?
Slashmc è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2011, 11:23   #5
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da Slashmc Guarda i messaggi
Ciao grazie per la risposta!
No non ho vincoli a riguardo...pensavo potesse essere l'approccio migliore per risolvere questo tipo di problema...ma ad essere sincero non ho mai usato le espressioni regolari in precedenza e quindi magari ho una visione errata del loro utilizzo...tu come risolveresti questo problema?
Umm... per prima cosa cercherei di analizzare bene il problema per prevedere eventuali casi limite e scegliere come gestirli prima di cominciare a scrivere del codice. Ad esempio, posto che tutto quello che sappiamo del problema è riassunto così:
Quote:
...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.
e posto che sappiamo come spezzare una stringa di testo nelle singole parole che la compongono (1° sottoproblema da risolvere; io al momento opterei per il metodo split di String) come deve essere gestito questo caso?
Codice:
parola target = pappa
testo in input = "Voglio subito tutta la mia pappa pappa pappa prima che inizi il film!"
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2011, 12:44   #6
Slashmc
Junior Member
 
Iscritto dal: Mar 2009
Messaggi: 7
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
... posto che sappiamo come spezzare una stringa di testo nelle singole parole che la compongono (1° sottoproblema da risolvere; io al momento opterei per il metodo split di String) come deve essere gestito questo caso?
Codice:
parola target = pappa
testo in input = "Voglio subito tutta la mia pappa pappa pappa prima che inizi il film!"
Ipotizzando che il numero di parole antecedenti e successive da far visualizzare sia 2 (N=2) nel caso da te indicato si dovrebbero avere in output le 3 seguenti sottostringhe:
1) la mia PAPPA pappa pappa
2) mia pappa PAPPA pappa prima
3) pappa pappa PAPPA prima che

C'e' pero' da considerare che io devo trovare nel testo solo la parola PAPPA e non parole che contengano la parola PAPPA (come ad esempio "pappagallo")...indendo dire che in questo caso:
Codice:
parola target = pappa
numero parole pre/post = 2 
testo in input = "Voglio subito tutta la mia pappa pappa pappagallo prima che inizi il film!"
l'output dovrebbe essere (al contrario di prima):
1) la mia PAPPA pappa pappagallo
2) mia pappa PAPPA pappagallo prima

per fare cio' all'interno con il metodo split di String credo che si dovrebbe usare comunque una regex...o sbaglio?
Slashmc è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2011, 12:52   #7
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da Slashmc Guarda i messaggi
Ipotizzando che...
[snip]
per fare cio' all'interno con il metodo split di String credo che si dovrebbe usare comunque una regex...o sbaglio?
Avrei usato split per ottenere un array di String i cui singoli elementi sono le parole contenute nel testo da analizzare.
Avendo quello in mano si tratta poi di fare una banale ricerca nell'array utilizzando gli indici.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)

Ultima modifica di banryu79 : 11-03-2011 alle 13:03.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2011, 13:09   #8
Don[ITA]
Senior Member
 
L'Avatar di Don[ITA]
 
Iscritto dal: Jul 2006
Città: Bergamo
Messaggi: 401
Si può risolvere comodamente con split(" ") ed una normale ricerca lineare della parola che ti interessa, come suggerito dal saggio banryu
Ma se:
Codice:
input = "a b c"
n = 1
target = "a"
quale dev'essere l'output???
__________________
iMac 27" 5K
Don[ITA] è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2011, 14:26   #9
Slashmc
Junior Member
 
Iscritto dal: Mar 2009
Messaggi: 7
Quote:
Originariamente inviato da Don[ITA] Guarda i messaggi
Si può risolvere comodamente con split(" ") ed una normale ricerca lineare della parola che ti interessa, come suggerito dal saggio banryu
Ma se:
Codice:
input = "a b c"
n = 1
target = "a"
quale dev'essere l'output???
Nel caso da te proposto l'output dovrebbe essere: "A b" ..allo stesso modo se:
Codice:
input = "a b c"
n = 1
target = "c"
allora output = "b C"
Slashmc è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2011, 16:10   #10
Don[ITA]
Senior Member
 
L'Avatar di Don[ITA]
 
Iscritto dal: Jul 2006
Città: Bergamo
Messaggi: 401
Qualcosa del genere dovrebbe fare al caso tuo:
Codice:
public static List<String> find(String input, String target, int n) {
    List<String> results = new LinkedList<String>();
    StringBuilder result;
    String[] words = input.split(" ");
    for(int i = 0; i < words.length; i++) {
        if(words[i].equals(target)) {
            result = new StringBuilder();
            int min_index = i - n > 0 ? i - n : 0;
            int max_index = i + n < words.length ? i + n : words.length - 1;
            for(int j = min_index; j < max_index; j++) result.append(words[j] + " ");
            result.append(words[max_index]);
            results.add(result.toString());
        }
    }
    return results;
}
Non credo sia la soluzione più performante per il tuo problema, ma fa quello che ti serve
__________________
iMac 27" 5K
Don[ITA] è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
24 offerte Amazon da non perdere, dalla ...
Apple starebbe progettando i propri cont...
Niente borsa per OpenAI prima del 2027: ...
Meta potrebbe aver mostrato in anticipo ...
Bicicletta elettrica L26 a 474,05€: e-bi...
NVIDIA RTX PRO 5500 Blackwell: 84 GB di ...
Sei alla ricerca di un buon gruppo di co...
Blizzard annuncia un nuovo StarCraft: la...
Ecobonus al 65%: il governo valuta il ri...
Biscotti fatti con bottiglie di plastica...
SIHOO B100 a 161€ e B100 Pro a 209€: sed...
ClickFix dilaga: un finto captcha e un c...
HP Envy 6520e a 63€: stampante multifunz...
Diablo diventa una serie animata Netflix...
iPhone Duo porterà Apple al 25% d...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 11:00.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v