|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Jan 2009
Messaggi: 137
|
[JAVA] Espressioni regolari stile xml
Sto creando un programma per gestire gli ebook, per gestirli creo un file txt con il nome dell'ebook.
Il file dove contenere qualcosa del genere: Codice:
<title>Mio libro</title><year>2012</year><home>Mia casa</home> Ringrazio tutte le persone che mi aiuteranno. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: May 2007
Città: Milano
Messaggi: 7098
|
cerca qualche lib gia pronta.
Estrarre da tag con sole regex è pericoloso.. ![]()
__________________
Apple Watch Ultra + iPhone 15 Pro Max + Rog Ally + Legion Go |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Scusa la fretta, ma oggi l'impianto sta facendo i capricci e devo fare una modifica molto pesante.
Per questo motivo, la regex che ti propongo l'ho provata solo usando vim, non Java: Codice:
\(<title>\)\([^<]*\)\(<\/title>\) Questa regex cerca le stringhe in formato <title>...</title> e suddivide la stringa trovata in 3 gruppi: il primo gruppo conterra' <title>, il secondo il titolo ed il terzo </title> Per quanto ne so, Java puo' manipolare i gruppi (non l'ho mai provato, pero'), basta guardare qui: http://docs.oracle.com/javase/tutori...ex/groups.html Puoi quindi estrarre i dati dal secondo gruppo
__________________
In God we trust; all others bring data |
![]() |
![]() |
![]() |
#4 |
Member
Iscritto dal: Jan 2009
Messaggi: 137
|
Ho provato il codice di sottovento ma non funziona, comunque lo ringrazio per l'aiuto.
Ultima modifica di Tecnomiky : 27-02-2013 alle 08:43. |
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
Se non hai fretta lo posso fare stasera, quando torno a casa
__________________
In God we trust; all others bring data |
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: May 2007
Città: Milano
Messaggi: 7098
|
__________________
Apple Watch Ultra + iPhone 15 Pro Max + Rog Ally + Legion Go |
![]() |
![]() |
![]() |
#7 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Che casino 'ste regexp in Java!
Secondo me è meglio scriversi un bel pushdown automaton ad hoc. Il codice viene un po' più lungo ma più leggibile, ma più efficiente. |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: May 2007
Città: Milano
Messaggi: 7098
|
non tantissimo.
Il fatto è che solo in Perl sono una parte del linguaggio. Cmq anche il link consiglia di usare librerie apposite. Il parsing xml è insidioso con regex
__________________
Apple Watch Ultra + iPhone 15 Pro Max + Rog Ally + Legion Go |
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Quote:
Codice:
import java.util.regex.Pattern; import java.util.regex.Matcher; public class Main { public static void main(String[] args) { String xml = "questa è la stringa xml con <title>Titolo</title> dentro"; Pattern TITLE = Pattern.compile("<title>([^<]+)</title>"); Matcher matcher = TITLE.matcher(xml); while (matcher.find()) { System.out.println("Titolo: " + matcher.group(1)); } } } |
|
![]() |
![]() |
![]() |
#10 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Praticamente bisognerà confrontare i tempi della soluzione proposta da Vicius col mio pushdown automaton.
Secondo me vince l'automa: http://swtch.com/~rsc/regexp/regexp1.html Naturalmente il confronto andrà fatto su un file di grosse dimensioni(o su tantissimi file di piccole-medie dimensioni). Ne verrà fuori una sorta di mini-contest. |
![]() |
![]() |
![]() |
#11 |
Member
Iscritto dal: Jan 2009
Messaggi: 137
|
Ho provato ma mi esce questo
Codice:
<title>Mio libro</title> Codice:
<title>Mio libro</title><year>2012</year><home>Mia casa</home> |
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Quote:
Posta il codice completo che hai usato e poi vediamo cosa hai sbagliato. |
|
![]() |
![]() |
![]() |
#13 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
|
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
![]() Cmq sono d'accordo, la regex deve funzionare cosi' com'e'. @Tecnomiky - hai copiato correttamente il codice? Sembra che ti sia dimenticato di mettere l'1 nell'istruzione Codice:
System.out.println("Titolo: " + matcher.group(1));
__________________
In God we trust; all others bring data |
|
![]() |
![]() |
![]() |
#15 |
Member
Iscritto dal: Jan 2009
Messaggi: 137
|
Non avevo aggiunto l' 1 dentro alla parentesi del matcher.group
|
![]() |
![]() |
![]() |
#16 | |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
Dunque, per fare un confronto dovresti scrivere un software che PRIMA accetti in ingresso un automa qualunque, specificato nel modo che vuoi tu, e poi ne confronti i tempi. Cosi' puoi vedere quanto le prestazioni dipendono dall'implementazione e non da restrizioni che hai imposto da una parte e non dall'altra ![]()
__________________
In God we trust; all others bring data |
|
![]() |
![]() |
![]() |
#17 |
Member
Iscritto dal: Jan 2009
Messaggi: 137
|
Comunque ho risolto grazie all'aiuto di sottovento. Si può chiudere
|
![]() |
![]() |
![]() |
#18 | |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
![]() Io dico che con una implementazione ad hoc, senza dunque dover creare al volo l'automa per una generica regexp, il programma(in Java stesso, non in C) sarebbe più efficiente. ![]() |
|
![]() |
![]() |
![]() |
#19 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
|
![]() |
![]() |
![]() |
#20 |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Ho capito di non aver capito: se voglio cercare una determinata stringa data in ingresso dall'utente, e tale stringa e' una regexp, cosa proponi di fare?
__________________
In God we trust; all others bring data |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 08:41.