|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Oct 2013
Messaggi: 158
|
ESPRESSIONI REGOLARI - info
Sto cercando di estrapolare dei dati tramite query in un database "speciale" e per filtrare i dati devo per forza usare delle espressioni regolari.
Se voglio cercare Roma attualmente con (\\W|^)Rome(\\W|$) mi trova cose come: Basilica_dei_Santi_Apostoli_(Rome), Egeria_(Rome), ..., e poi finalmente Rome. Il problema è che mi trova molte cose che non voglio come Basilica_dei_Santi_Apostoli_(Rome) e mi trova Rome al 200esimo posto, mentre Basilica è il primo risultato. Come posso fare per trovare Rome per primo tramite espressione regolare? |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2775
|
Concettualmente mi sembra sbagliato quello che vuoi fare. Vorresti ordinare i risultati della ricerca ma lo vuoi fare con un linguaggio fatto per filtrare. Ordinare != Filtrare
Non puoi post-processare i risultati ordinandoli ad esempio per lunghezza? Oppure il metodo che usi per interrogare questo database "speciale" non offre qualcosa per specificare in qualche modo l'ordinamento? |
![]() |
![]() |
![]() |
#3 | |
Member
Iscritto dal: Oct 2013
Messaggi: 158
|
Quote:
Codice:
SELECT DISTINCT * FROM <http://dbpedia.org> where { [] foaf:isPrimaryTopicOf ?wikiID. FILTER (regex(?wikiID, "(\W|^)''' + AJAX_data + '''(\W|$)")) . } ORDER BY ?wikiID limit 50 Pero se cercassi Roma, troverei non solo l'uri di wikipedia di Roma, ma tutti quelli che hanno all'interno la parola Roma, e Roma stessa sarebbe presente dopo tanti risultati. |
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2775
|
Molto interessante questo progetto! Comunque riguardo alla tua domanda: non puoi modificare il resto della query? Solo la regex?
|
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
\\WRome\\W ?
__________________
In God we trust; all others bring data |
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Non conosco questo particolare linguaggio, ma l'espressione "\W" mi suggerisce qualcosa come "word", nel senso di parola intera. I caratteri ^ e $ vengono generalmente utilizzati per indicare l'inizio e fine di una stringa.
Io proverei "^Rome$". |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Veramente e' il contrario: \W indica ogni carattere che NON appartiene ad una parola. Quello che ti suggerisce "word" e' \w
__________________
In God we trust; all others bring data |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Quindi si dovrebbe leggere: qualunque carattere che non appartiene ad una parola, seguito da "Rome", seguito da qualunque carattere che non appartiene ad una parola.
Da cui le corrispondenze con sequenze come "Egeria_(Rome)", mentre per la corrispondenza esatta ci pensano |^ e |$. Quindi perché "\\WRome\\W" dovrebbe selezionare solo "Rome"? Mi sembrava che la richiesta fosse proprio quella di trovare solo la corrispondenza esatta, o sbaglio? |
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2775
|
Quote:
Sì se vuole solo una corrispondenza esatta sarebbe giusto così, io ho dato per scontato che volesse mantenere tutte le corrispondenze. |
|
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
Codice:
Pattern p = Pattern.compile("Rome"); Matcher m = p.matcher(<la stringa da verificare>); boolean result = Matcher.matches() Sospetto che voglia qualcosa di diverso, che magari non e' stato specificato per brevita'
__________________
In God we trust; all others bring data |
|
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2775
|
Non mi sembra, se non metti ^ e $ il match può avvenire in qualunque punto della stringa. Per esempio troverebbe anche Romeo
|
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Nel caso di più risultati, se si potesse mettere una funzione nella clausola order by - per esempio strlen - si potrebbe ottenere un ordinamento conveniente.
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
No, il matches() e' sull'intera stringa
__________________
In God we trust; all others bring data |
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2775
|
|
![]() |
![]() |
![]() |
#15 | |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
Sono d'accordo con te che non sta utilizzando il metodo matches() ma se il suo scopo e' quello di trovare il match esatto lo potrebbe fare, visto che ce l'ha a disposizione
__________________
In God we trust; all others bring data |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:24.