View Full Version : [Java] espressione regolare
vorrei tagliare il testo di un stringa che è racchiuso tra parentesi graffe, esempio:
abc de fg {456} hil 568 abc
deve diventare:
456
Ho letto e riletto varie guide ma non ci sono riuscito,
queste espressioni regolari non le ho capite.:mc:
Qualcuno mi saprebbe dare l'espressione regolare che mi serve?
le espressioni regolari non servono a modificare una stringa di input, servono solo a riconoscere. se tu dai una stringa in pasto ad un'espressione regolare quella ti risponde solo "si" o "no", non ti puó rispondere "456".
le espressioni regolari non servono a modificare una stringa di input, servono solo a riconoscere. se tu dai una stringa in pasto ad un'espressione regolare quella ti risponde solo "si" o "no", non ti puó rispondere "456".
intendevo dire che mi srve un espressione regolare da usare come delimitatore con una funzione apposita che uso per sezionare la stringa,
es:String.split(), StringTokenizer, etc etc...
so che si può fare, lo già fatto.
Vorrei sapere quel'è l'espressione regolare che fà a caso mio, dato che non ciriesco da solo
nuovoUtente86
26-07-2010, 20:08
le espressioni regolari non servono a modificare una stringa di input, servono solo a riconoscere. se tu dai una stringa in pasto ad un'espressione regolare quella ti risponde solo "si" o "no", non ti puó rispondere "456".
In realtà formalmente le espressioni regolari descrivono linguaggi regolari. Ovviamente vengono utilizzate per la ricerca all' interno di stringhe, ma passandole come argomento ad alcuni metodi della classe String di Java è possibile operare alcune operazioni , come il substring o la sostituzione di caratteri.
C'è qualche programmatore java che conosce la giusta stringa (espressione regolare) da usare come delimitatore con StringTokenizer o String.split() nel caso sopra-citato?
Link: http://download.oracle.com/docs/cd/E17476_01/javase/1.4.2/docs/api/java/util/StringTokenizer.html
nuovoUtente86
26-07-2010, 20:44
vorrei tagliare il testo di un stringa che è racchiuso tra parentesi graffe, esempio:
abc de fg {456} hil 568 abc
deve diventare:
456
Ho letto e riletto varie guide ma non ci sono riuscito,
queste espressioni regolari non le ho capite.:mc:
Qualcuno mi saprebbe dare l'espressione regolare che mi serve?
prima e dopo le graffe come possono variare le stringhe?
Ciao, questa ti prende solo i numeri compresi fra le graffe
(?<={)\d+(?=})
edit: l'errore era che andava fatto l'escape anche delle graffe così
(?<=\{)\d+(?=\})
prima e dopo le graffe come possono variare le stringhe?
Stringhe tipo:
javax.swing.event.ListSelectionEvent[ source=javax.swing.DefaultListSelectionModel 1491344323 ={2} firstIndex= 2 lastIndex= 2 isAdjusting= false ]
A me interessa estrarre i numeri (anche a più cifre) tra {}, in questo caso {2} => 2
Ciao, questa ti prende solo i numeri compresi fra le graffe
(?<={)\d+(?=})
ottengo questo errore:
Exception in thread "AWT-EventQueue-0" java.util.regex.PatternSyntaxException: Illegal repetition near index 3
(?<={)d+(?=})
nuovoUtente86
26-07-2010, 22:15
dovrebbe bastarti fare split("[{]|[}]"); ed utilizzare l' elemento in posizione 1 del vettore.
Stringhe tipo:
javax.swing.event.ListSelectionEvent[ source=javax.swing.DefaultListSelectionModel 1491344323 ={2} firstIndex= 2 lastIndex= 2 isAdjusting= false ]
A me interessa estrarre i numeri (anche a più cifre) tra {}, in questo caso {2} => 2
ottengo questo errore:
Exception in thread "AWT-EventQueue-0" java.util.regex.PatternSyntaxException: Illegal repetition near index 3
(?<={)d+(?=})
mmm strano che ottieni errore, hai messo due \\ prima del d visto che lo scrivi in una stringa?
(?<={)\\d+(?=})
dovrebbe bastarti fare split("[{]|[}]"); ed utilizzare l' elemento in posizione 1 del vettore.
Da quel che ho capito, lui vorrebbe usare la regex che sta chiedendo come splitter per uno split.
Perchè se il suo scopo ultimo è solo quello di prendere il numero all'interno delle graffe vi sono innumerevoli metodi
intendevo dire che mi srve un espressione regolare da usare come delimitatore con una funzione apposita che uso per sezionare la stringa,
es:String.split(), StringTokenizer, etc etc... allora usa le graffe come delimitatori, no? ad esempio chiama:
String.split("[{}]");
In realtà formalmente le espressioni regolari descrivono linguaggi regolari. come tu saprai i linguaggi regolari sono riconoscibili, infatti un motore di espressioni regolari dovrebbe essere in grado di "riconoscere" una stringa, cioé dire se fa parte o no del linguaggio regolare descritto da una certa espressione regolare.
Ovviamente vengono utilizzate per la ricerca all' interno di stringhe, ma passandole come argomento ad alcuni metodi della classe String di Java è possibile operare alcune operazioni , come il substring o la sostituzione di caratteri. il metodo String.substring non prende espressioni regolari. ad ogni modo non vedo cosa c'entri con ció la frase che ho precedentemente quotato.
Ciao, questa ti prende solo i numeri compresi fra le graffe
(?<={)\d+(?=}) no, questa riconosce le stringhe contenenti numeri compresi tra graffe.
no, questa riconosce le stringhe contenenti numeri compresi tra graffe.
No, quello fa quello che stato chiesto. Cattura i numeri SOLO se se la stringa è di questo tipo xxx{numeri}xxxx
No, quello fa quello che stato chiesto. Cattura i numeri SOLO se se la stringa è di questo tipo xxx{numeri}xxxx ripeto, un'espressione regolare di per se' puó rispondere solo si o no, vero o falso, appartiene o non appartiene.
che poi vengano usate in algoritmi piu complessi per cercare prefissi, suffissi e sottostringhe é un altro discorso, ma in questo caso dovresti specificare in che modo va usata quell'espressione regolare, cioé a quale metodo va passata e di quale classe.
ripeto, un'espressione regolare di per se' puó rispondere solo si o no, vero o falso, appartiene o non appartiene.
che poi vengano usate in algoritmi piu complessi per cercare prefissi, suffissi e sottostringhe é un altro discorso, ma in questo caso dovresti specificare in che modo va usata quell'espressione regolare, cioé a quale metodo va passata e di quale classe.
Va usata nello split come richiesto dal thread starter no?
Il fatto che una regex ti dice solo se c'è il match o no è ovvio, non c'è nemmeno bisogno di dirlo, ma ovviamente una regex si può usare per fare praticamente qualsiasi cosa nella manipolazione del testo.
dovrebbe bastarti fare split("[{]|[}]"); ed utilizzare l' elemento in posizione 1 del vettore.
allora usa le graffe come delimitatori, no? ad esempio chiama:
String.split("[{}]");
riflettendoci meglio peró soluzioni di questo genere possono fornire un risultato errato, come in questo caso:
123}456{789}876
l'output desiderato sarebbe "789" mentre invece si otterrebbe "456". inoltre, per come é stato posto il problema, non é chiaro quale output si vorrebbe ottenere in un caso come questo:
123{456{789}876
si dovrebbe ottenere "456{789" oppure "789"?
le espressioni regolari non servono a modificare una stringa di input, servono solo a riconoscere. se tu dai una stringa in pasto ad un'espressione regolare quella ti risponde solo "si" o "no", non ti puó rispondere "456".
Questo assolutamente non è vero, l'applicazione principe di uan regexp e fare un match su una stringa, ovvero catturare solo quel che si vuole da una stringa, quindi una regexp può tornaryi solo 456 eccome.
Probabilmente non conosci molto bene questo strumento...
Va usata nello split come richiesto dal thread starter no? ma cosi non si ottiene una stringa, si ottiene un array di stringhe: quale elemento dovrei prendere per avere l'output finale?
ad ogni modo sarei curioso di provarla ma non funziona.
Il fatto che una regex ti dice solo se c'è il match o no è ovvio, non c'è nemmeno bisogno di dirlo, per te magari, anche se non l'avrei detto.
ma ovviamente una regex si può usare per fare praticamente qualsiasi cosa nella manipolazione del testo. molte operazioni invece possono essere risolte senza farne uso.
Questo assolutamente non è vero, l'applicazione principe di uan regexp e fare un match su una stringa, ovvero catturare solo quel che si vuole da una stringa, quindi una regexp può tornaryi solo 456 eccome.
Probabilmente non conosci molto bene questo strumento... come detto precedentemente nella discussione, un'espressione regolare non fa altro che descrivere un linguaggio riconoscibile, cioé un linguaggio a cui é possibile dire se una stringa appartiene o meno. punto.
l'operazione di matching di una stringa data una certa espressione regolare consiste semplicemente nel dire se quella stringa appartiene o meno al linguaggio regolare descritto dall'espressione; é un'operazione che restituisce solo vero o falso, non restituisce nessuna stringa. guarda il prototipo del metodo String.matches: prende un'espressione regolare e restituisce un booleano.
ma cosi non si ottiene una stringa, si ottiene un array di stringhe: quale elemento dovrei prendere per avere l'output finale?
ad ogni modo sarei curioso di provarla ma non funziona.
DNAx86 chiedeva una regexp da usare come split per dividire una stringa, (probabilmente ha una stringa xxxxx{456}xxxx e vuyole spezzarla che ne so) quindi quella regexp va usata in uno split e non ti da i numeri all'interno delle graffe ovviamente visto che non è quello richiesto, anche se ovviamente facendo un match te li da.
per te magari, anche se non l'avrei detto.
molte operazioni invece possono essere risolte senza farne uso.
Si capisce che non conosci assolutamente le espressioni regolari :)
DNAx86 chiedeva una regexp da usare come split per dividire una stringa, (probabilmente ha una stringa xxxxx{456}xxxx e vuyole spezzarla che ne so) quindi quella regexp va usata in uno split e non ti da i numeri all'interno delle graffe ovviamente visto che non è quello richiesto. non leggo risposta alla mia domanda; e comunque, ripeto, l'espressione regolare che hai postato non funziona (ma dovresti metterci poco a correggerla visto che tu conosci bene questo strumento).
Si capisce che non conosci assolutamente le espressioni regolari :) no, si capisce solo che hai finito gli argomenti :)
come detto precedentemente nella discussione, un'espressione regolare non fa altro che descrivere un linguaggio riconoscibile, cioé un linguaggio a cui é possibile dire se una stringa appartiene o meno. punto.
l'operazione di matching di una stringa data una certa espressione regolare consiste semplicemente nel dire se quella stringa appartiene o meno al linguaggio regolare descritto dall'espressione; é un'operazione che restituisce solo vero o falso, non restituisce nessuna stringa. guarda il prototipo del metodo String.matches: prende un'espressione regolare e restituisce un booleano.
Assolutamente no, una regexp la usi come vuoi, il motore del matching delle regular expressione è potentissimo, dovresti mettertici e imparare ad usarle :) , prima magari però impara a leggere i javadoc alla ricerca delle funzioni che ti servono, ti sei fermato troppo presto.
Per la tua curiosità ecco qui
String regex="(?<=\\{)\\d+(?=\\})";
String s="abc de fg {456} hil 568 abc";
// fa lo split (quello richiesto dal thread starter
String[] sArray=s.split(regex);
for(String splitted : sArray){
System.out.println(splitted);
}
// prende solo 456 (questo è per farti capire)
Pattern p=Pattern.compile(regex);
Matcher m=p.matcher(s);
if(m.find()) System.out.println(m.group());
Ah altra cosa, le regexp sono anche molto veloci, molto di più dei magheggi che saresti costretto a fare tu per fare anche banali operazioni sul testo che non siano semplicemente dei replace di un paio di caratteri :)
Assolutamente no, una regexp la usi come vuoi, diciamo allora che voglio concatenare due stringhe: "ab" e "cd", vorrei ottenere "abcd". a cosa mi serve l'espressione regolare?
il motore del matching delle regular expressione è potentissimo, il motore di matching di sicuro fa solo matching, cioé dice solo si o no. se poi esistono degli ulteriori algoritmi basati sul matching che producono anche altri risultati é un altro discorso.
dovresti mettertici e imparare ad usarle :) ma falla finita :asd:
prima magari però impara a leggere i javadoc alla ricerca delle funzioni che ti servono, ti sei fermato troppo presto. prima di arrivare a cosa? c'é qualche documentazione in javadoc che contraddice qualcosa che io ho scritto?
perché, al contrario, esiste molta letteratura che contraddice ció che tu hai scritto.
Per la tua curiosità ecco qui
String regex="(?<=\\{)\\d+(?=\\})";
String s="abc de fg {456} hil 568 abc";
// fa lo split (quello richiesto dal thread starter
String[] sArray=s.split(regex);
for(String splitted : sArray){
System.out.println(splitted);
}
non funziona, mi restituisce questo output:
abc de fg {
} hil 568 abc
Ah altra cosa, le regexp sono anche molto veloci, molto di più dei magheggi che saresti costretto a fare tu per fare anche banali operazioni sul testo che non siano semplicemente dei replace di un paio di caratteri :) e a me...?
diciamo allora che voglio concatenare due stringhe: "ab" e "cd", vorrei ottenere "abcd". a cosa mi serve l'espressione regolare?
il motore di matching di sicuro fa solo matching, cioé dice solo si o no. se poi esistono degli ulteriori algoritmi basati sul matching che producono anche altri risultati é un altro discorso.
ma falla finita :asd:
prima di arrivare a cosa? c'é qualche documentazione in javadoc che contraddice qualcosa che io ho scritto?
perché, al contrario, esiste molta letteratura che contraddice ció che tu hai scritto.
non funziona, mi restituisce questo output:
abc de fg {
} hil 568 abc
e a me...?
haha ok dai per me è finita qui. ciao.
haha ok dai per me è finita qui. ciao. chiaro :asd:
se posso suggerirti una strategia retorica che per il futuro ti aiuterá sicuramente ad evitare un misero fallimento come quello di questa discussione, cerca di rispondere a quello che ti si chiede; te lo dico perché tu non lo fai mai e quindi si potrebbe pensare che tu in realtá non sappia le risposte.
buonanotte.
chiaro :asd:
se posso suggerirti una strategia retorica che per il futuro ti aiuterá sicuramente ad evitare un misero fallimento come quello di questa discussione, cerca di rispondere a quello che ti si chiede; te lo dico perché tu non lo fai mai e quindi si potrebbe pensare che tu in realtá non sappia le risposte.
buonanotte.
ahahaha, lavori in un castello per caso?
Guarda che qui quello che ci sta facendo una magra figura sei tu, spero che qualcuno che legga intervenga per fartelo gentilmente notare.
Io non solo ti ho risposto a tutto, ho anche perso tempo per scriverti un paio di banali righe di codice solo perchè tu non ne sei stato capace, e nonostante questo non sei nemmeno riuscito a capirle :)
non funziona, mi restituisce questo output:
abc de fg {
} hil 568 abc
E' uno split, vai a leggerti come funziona e a cosa serve e poi magari ragionaci su stanotte e domani ci posti i tuoi commenti.
diciamo allora che voglio concatenare due stringhe: "ab" e "cd", vorrei ottenere "abcd". a cosa mi serve l'espressione regolare?
Ma che domanda stupida è?
Non ti serve a nulla in questo caso ovviamente.
il motore di matching di sicuro fa solo matching, cioé dice solo si o no. se poi esistono degli ulteriori algoritmi basati sul matching che producono anche altri risultati é un altro discorso.
:mc:
e a me...?
e a te?
hahahah sei ignorante su queste cose e sembra ti piaccia.
Contento te contento tutti.
Spero che il thread sia servito almeno al thread starter per il suo problema.
nuovoUtente86
26-07-2010, 23:57
Da quel che ho capito, lui vorrebbe usare la regex che sta chiedendo come splitter per uno split.
Perchè se il suo scopo ultimo è solo quello di prendere il numero all'interno delle graffe vi sono innumerevoli metodi
Scusa per te [{]|[}] equivalente ad [{}] cosa è?
E' una espressione regolare con il significato :" è presente una graffa aperta oppure una chiusa" o equivalentemente { e } fanno parte dei caratteri leciti.
Anche quella da te postata è una espressione regolare, sintetticamente corretta, ma semanticamente inadatta allo split: infatti utilizza come delimitatore le cifre (con molteplicità maggiore di uno) che rispettano le regole di lookahead,ovvero sono precedute e seguite da una graffa aperta e chiusa. Ma cosi facendo, dividono la stringa, bypassando proprio la parte d' interesse.
ahahaha, lavori in un castello per caso?
Guarda che qui quello che ci sta facendo una magra figura sei tu, spero che qualcuno che legga intervenga per fartelo gentilmente notare. :friend:
Io non solo ti ho risposto a tutto, in tal caso devo essermi perso le risposte; per chiarezza quoto le mie domande a cui non ho trovato risposta da parte tua:
ma cosi non si ottiene una stringa, si ottiene un array di stringhe: quale elemento dovrei prendere per avere l'output finale?
diciamo allora che voglio concatenare due stringhe: "ab" e "cd", vorrei ottenere "abcd". a cosa mi serve l'espressione regolare?
prima di arrivare a cosa? c'é qualche documentazione in javadoc che contraddice qualcosa che io ho scritto?
perché, al contrario, esiste molta letteratura che contraddice ció che tu hai scritto.
ho anche perso tempo per scriverti un paio di banali righe di codice solo perchè tu non ne sei stato capace, le righe banali che hai scritto forniscono un output ben diverso da quello richiesto nel primo post, ti pare? io, al contrario, ho abbozzato del codice che con un po' di completamento fornisce un output corretto rispetto all'input fornito:
System.out.println("abc de fg {456} hil 568 abc".split("[{}]")[1]);
E' uno split, vai a leggerti come funziona e a cosa serve e poi magari ragionaci su stanotte e domani ci posti i tuoi commenti. a casa mia uno "split" é una separazione, quindi forse non riesco a capire il tuo linguaggio sportivo e agile ma sinceramente mi sfugge il modo esatto in cui, da quell'output, io dovrei riuscire a ricavare la stringa "456".
Scusa per te [{]|[}] equivalente ad [{}] cosa è?
E' una espressione regolare con il significato :" è presente una graffa aperta oppure una chiusa" o equivalentemente { e } fanno parte dei caratteri leciti.
Anche quella da te postata è una espressione regolare, sintetticamente corretta, ma semanticamente inadatta allo split: infatti utilizza come delimitatore le cifre (con molteplicità maggiore di uno) che rispettano le regole di lookahead,ovvero sono precedute e seguite da una graffa aperta e chiusa.
mmm no spe, col tuo metodo funziona?
Io mi sono basato sull'input proposto da DNAx86 e con la mia regex funziona, se hai trovato un caso dove non funziona sei libero di farlo notare.
a casa mia uno "split" é una separazione, quindi forse non riesco a capire il tuo linguaggio sportivo e agile ma sinceramente mi sfugge il punto esatto in cui, da quell'output, io dovrei riuscire a ricavare la stringa "456".
A me pareva che serviva la regex da utilizzare in uno split, e non ottenere come outpup 456 (che comunque nel codice che ti ho postato ti ho fatto vedere come si fa).
Quindi nel dubbiot il codice che ti ho scritto fa entrambe le cose, la regex viene usata sia per fare lo split(e se DNA non smentisce penso sia quello che gli serve...) sia per catturare i numeri all'interno delle graffe.
Quindi che ti serve ancora?
ma cosi non si ottiene una stringa, si ottiene un array di stringhe: quale elemento dovrei prendere per avere l'output finale?
Ancora... si ottiene un array perchè è quello che secondo me è stato chiesto!
Ma comunque la puoi poi usare come vuoi.
Scusa per te [{]|[}] equivalente ad [{}] cosa è?
E' una espressione regolare con il significato :" è presente una graffa aperta oppure una chiusa" o equivalentemente { e } fanno parte dei caratteri leciti.
Anche quella da te postata è una espressione regolare, sintetticamente corretta, ma semanticamente inadatta allo split: infatti utilizza come delimitatore le cifre (con molteplicità maggiore di uno) che rispettano le regole di lookahead,ovvero sono precedute e seguite da una graffa aperta e chiusa. Ma cosi facendo, dividono la stringa, bypassando proprio la parte d' interesse.
Ho provato, la tua regex non funziona, potrei sbagliarmi data l'ora ma non credo.
Ma che domanda stupida è?
Non ti serve a nulla in questo caso ovviamente. ah, ecco. come dicevo, ci sono diverse operazioni sulle stringhe per le quali non é necessario usare espressioni regolari. molti linguaggi di programmazione sono linguaggi regolari, eppure i compilatori in genere non devono necessariamente o ragionevolmente fare uso di espressioni regolari.
:mc: vogliamo essere un po' piu chiari su questo punto?
e a te?
hahahah sei ignorante su queste cose e sembra ti piaccia.
Contento te contento tutti. permettimi di dirti che vali veramente poco: anziché rispondere a tono continui a fare assunzioni sulla mia preparazione. come a dire che, messo di fronte ad un problema da me posto, preferisci assumere che io non conosca il problema, cosi magari lo elimini a priori.
Spero che il thread sia servito almeno al thread starter per il suo problema. non certo grazie a te.
nuovoUtente86
27-07-2010, 00:07
mmm no spe, col tuo metodo funziona?
Io mi sono basato sull'input proposto da DNAx86 e con la mia regex funziona, se hai trovato un caso dove non funziona sei libero di farlo notare.
L' obiettivo è estrarre il numero fra le parentesi: con il mio metodo, lo ritrovo nella posizione 1 del vettore (se la stringa è correttamente formata come proposto), con il tuo metodo la dividi semplicemente in 2 parti, utilizzando come pivot proprio il numero cercato, che però "perdi per strada", perchè non viene estratto, facendo da delimitatore.
nuovoUtente86
27-07-2010, 00:09
Ho provato, la tua regex non funziona, potrei sbagliarmi data l'ora ma non credo.
probabilmente ti sfugge la richiesta dell' utente, altrimenti non si spiega come la tua possa funzionare e la mia no, essendo esattamente il contrario.
Ragazzi, la smettete di punzecchiarvi? Non mi pare il caso, veramente. Secondo me se affrontaste la cosa con toni diversi vi accorgereste che siete d'accordo.
Ah altra cosa, le regexp sono anche molto veloci, molto di più dei magheggi che saresti costretto a fare tu per fare anche banali operazioni sul testo che non siano semplicemente dei replace di un paio di caratteri :)Le espressioni regolari nascondono anche tante insidie. Non per farmi pubblicità, ma ho cercato di spiegare la cosa nella mia guida:
Le regular expressions, come e quando
...
Le espressioni regolari (da ora in poi, RE) sono un aiuto importante per mantenere snello e compatto il proprio codice, riducendo ad una sola riga quel che normalmente avremmo fatto magari in decine di righe. I più comuni linguaggi di programmazione offrono pacchetti spesso molto completi e di facile reperibilità per le RE, quando non proprio forniti con le più comuni distribuzioni; alcuni linguaggi hanno addirittura supporto nativo alle RE (Javascript, Perl, PHP, Actionscript 3).
Non solo: spesso, molti editor di testo nonché ambienti di sviluppo offrono la possibilità di ricerca e sostituzione del testo tramite RE, e questo può essere uno strumento estremamente utile per risparmiarsi laboriose azioni magari fatte a mano.
Ma, se da una parte abbiamo uno strumento potente e flessibile subito a disposizione, dall'altra ci sono da pagare due scotti principali:
condensando in pochi caratteri diverse righe di codice, il programma può risentirne parecchio in leggibilità e capacità di poterci intervenire per modifiche future (non è infatti raro che, con la prospettiva di dover modificare una RE, si opti - e a ragione - per riscriverla daccapo);
le RE nascondono dietro di sé un codice nativo ma molto complesso, cioè quello che avremmo dovuto scrivere in sua vece: in poche parole, le RE possono rivelarsi lente, soprattutto se mal progettate.
Insomma, questo è per dirvi: non abusatene. Spesso un codice brillante può risultare più chiaro e veloce.
ah, ecco. come dicevo, ci sono diverse operazioni sulle stringhe per le quali non é necessario usare espressioni regolari. molti linguaggi di programmazione sono linguaggi regolari, eppure i compilatori in genere non devono necessariamente o ragionevolmente fare uso di espressioni regolari.
vogliamo essere un po' piu chiari su questo punto?
permettimi di dirti che vali veramente poco: anziché rispondere a tono continui a fare assunzioni sulla mia preparazione. come a dire che, messo di fronte ad un problema da me posto, preferisci assumere che io non conosca il problema, cosi magari lo elimini a priori.
non certo grazie a te.
Permettermi di farti notare che la tua preparazione su queste cose è assente, e quindi sollevi problemi con la presunzione di avere in bocca la verità assoluta ma che francamente dipendono solo dal fatto che non conosci l'argomento.
Tra l'altro non capisco perchè stai andando avanti considerando che ho proprosto una soluzione funzionante al problema.
Magari non ho capito la richiesta del thread starte, quello ci puù stare(ma deve intervenire lui per confermarmelo) ma per quel che ho capito io la mia soluzione va bene.
L' obiettivo è estrarre il numero fra le parentesi: con il mio metodo, lo ritrovo nella posizione 1 del vettore (se la stringa è correttamente formata come proposto), con il tuo metodo la dividi semplicemente in 2 parti, utilizzando come pivot proprio il numero cercato, che però "perdi per strada", perchè non viene estratto, facendo da delimitatore.
Ma dal secondo post del thread starter mi pareva che cercasse proprio questo, ossia dividere stringhe utilizzando come pivot la regex che cercava...
Comunque la tua funziona se nella stringa è formata esattamente come nell'esmepio, in una stringa del genre ad esempio "hejhve {372239729 {hebdeh73 {37} edbjeh}7233hj" la richiesta sarebbe di catturara/splittare sul 37 contenuto in tra le graffe, ma la tua regex splitta in molte più parti e quindi ci sono da fare ulteriori controlli... come già detto si arriva di sicuro al medesimo risultato ma con molti più passaggi che spesso sono anche onerosi in termini prestazionali.
Comunque, poco sopra ho scritto un esempio che ti rimetto qui
String regex="(?<=\\{)\\d+(?=\\})";
String s="abc de fg {456} hil 568 abc";
// fa lo split (quello richiesto dal thread starter
String[] sArray=s.split(regex);
for(String splitted : sArray){
System.out.println(splitted);
}
// prende solo 456 (questo è per farti capire)
Pattern p=Pattern.compile(regex);
Matcher m=p.matcher(s);
if(m.find()) System.out.println(m.group());
Questo fa sia lo split che la cattura, ovviamente io ho messo un if(m.find()) ma ciclando con un while catturi tutti i match trovati.
E' esaustiva questa mia risposta?
A me pareva che serviva la regex da utilizzare in uno split, e non ottenere come outpup 456 (che comunque nel codice che ti ho postato ti ho fatto vedere come si fa).
Quindi nel dubbiot il codice che ti ho scritto fa entrambe le cose, la regex viene usata sia per fare lo split(e se DNA non smentisce penso sia quello che gli serve...) sia per catturare i numeri all'interno delle graffe. mi resta solo qualche dubbio sul tuo concetto di split. se lo split di questa stringa:
"abc de fg {456} hil 568 abc"
sono queste due stringhe:
"abc de fg {"
"} hil 568 abc"
allora il delimitatore é sicuramente la stringa "456", ma non capisco a che scopo identificare come delimitatore quello che per il thread starter deve essere l'output.
Quindi che ti serve ancora? manca un'ultima risposta.
Ragazzi, la smettete di punzecchiarvi? Non mi pare il caso, veramente. Secondo me se affrontaste la cosa con toni diversi vi accorgereste che siete d'accordo. ehm, perdonami ma ho letto delle cose scritte da MEMon con cui non potrei mai essere d'accordo, ne' all'una di notte ne' a mezzogiorno. quantomeno non dopo essermi sfranto la capoccia di pippe mentali appresso al corso di linguaggi e compilatori.
mi resta solo qualche dubbio sul tuo concetto di split. se lo split di questa stringa:
"abc de fg {456} hil 568 abc"
sono queste due stringhe:
"abc de fg {"
"} hil 568 abc"
allora il delimitatore é sicuramente la stringa "456", ma non capisco a che scopo identificare come delimitatore quello che per il thread starter deve essere l'output.
manca un'ultima risposta.
Se il thread starter voleva catturare solo 456 allora devi guardare il secondo pezzo del codice che ho postato, il quale cattura quello.
Ma io mi son rifatto a questo
intendevo dire che mi srve un espressione regolare da usare come delimitatore con una funzione apposita che uso per sezionare la stringa,
es:String.split(), StringTokenizer, etc etc...
Pensando che gli servisse come pivot per uno split...
Permettermi di farti notare che la tua preparazione su queste cose è assente, e quindi sollevi problemi con la presunzione di avere in bocca la verità assoluta ma che francamente dipendono solo dal fatto che non conosci l'argomento. e da che pulpito per curiositá?
Tra l'altro non capisco perchè stai andando avanti considerando che ho proprosto una soluzione funzionante al problema. non c'entra nulla, io posso continuare a proporre le mie osservazioni finché restano questioni aperte.
nuovoUtente86
27-07-2010, 00:21
Dal primo posto sembra chiaro come il suo intento sia ripulire la stringa a tutto ciò non sia il numero fra le parentesi, ed ha specificato di dover (o voler utilizzare) slit o tokenizer, ecco perchè in questo contesto non va bene la tua soluzione. Ovviamente funziona utilizzando Pattern e Matcher.
Ma io mi son rifatto a questo
[...]
Pensando che gli servisse come pivot per uno split... da quel post non é per niente chiaro cosa voglia ottenere, ma nel primo post lo spiega meglio fornendo un caso di input col rispettivo output.
@MEMon: ripeto, mi manca un'ultima risposta da parte tua.
Dal primo posto sembra chiaro come il suo intento sia ripulire la stringa a tutto ciò non sia il numero fra le parentesi, ed ha specificato di dover (o voler utilizzare) slit o tokenizer, ecco perchè in questo contesto non va bene la tua soluzione. Ovviamente funziona utilizzando Pattern e Matcher.
Ah ok se deve assolutamente usare lo split per ottenere quei numeri allora ok va cambiata.
Ma siamo sicuri?
@MEMon: ripeto, mi manca un'ultima risposta da parte tua.
la rispota a " da che pulpito?"
astorcas
27-07-2010, 00:27
oh my god, ma qua è ormai uno scannatoio continuo. Mi sa che chiudere la piazzetta è stata una cattiva idea... non si sa più dove sfogarsi... :asd:
la rispota a " da che pulpito?" no, a questo:
prima di arrivare a cosa? c'é qualche documentazione in javadoc che contraddice qualcosa che io ho scritto?
perché, al contrario, esiste molta letteratura che contraddice ció che tu hai scritto.
ma poi in realtá mi sono accorto che c'é anche questo: vogliamo essere un po' piu chiari su questo punto?
sto staccando, leggeró nei prossimi giorni (domani e/o dopodomani no perché vado al mare :p). buonanotte.
no, a questo:
ma poi in realtá mi sono accorto che c'é anche questo:
Ti facevo notare che ti eri fissato sulla funzione matches..., che è vero che ti torna solo un boolean, ma è altrettanto vero che quella non serve per usare le regex come si deve, serve SOLO a sapere se c'è o no match.
E' una limitazione, diciamo una abbreviazione di utilizzo della regex (presente in quasi tutti i linguaggi), visto che a volte ci si trova solo a dover sapere se un determinato gruppo di caratteri è presente in un altro gruppo
Come dicevo è solo la piccolissima punta dell'iceberg, spesso infatti si utilizza una regexp per manipolare in tutto e per tutto del testo.
Per l'altra domanda mi dovrei ripetere, visto che è sempre la solita tesi che stai tenendo dall'inizio, l'utilizzo delle regex va ben oltre un semplice vero o falso, c'è non c'è, che poi sia quello che internamente il motore del matching fa poco importa sinceramente. L'utilizzo è ben più vasto.
Buonanotte e buone vacanze (se stai andando in vacanza :D)
malocchio
27-07-2010, 02:25
Posto una mia soluzione al problema esposto:
import java.util.regex.*;
/**
* @author malocchio
*/
public class RegexTest {
public static void main(String[] args) {
String s = "abc de fg {456} hil 568 abc";
Matcher m = Pattern.compile("\\{(\\d+)\\}").matcher(s);
while (m.find()) {
System.out.println(m.group(1));
}
}
}
Ricordo che le parentesi tonde, in una regex, servono per catturare il contenuto al loro interno e renderlo facilmente recuperabile ad ogni riscontro tramite il metodo group().
L'output restituito per l'esempio sopra mi risulta corretto:
456
Giovanni Tavella
27-07-2010, 09:36
import java.util.Scanner;
public class EspressioniRegolari {
public static void main(String[] args) {
String s="adsf 87 {123} er";
Scanner sc=new Scanner(s);
sc.useDelimiter("");
String New="";
String controllo=null;
boolean graf=false;
while(sc.hasNext()){
controllo=sc.next();
if(controllo.equals("{"))
graf=true;
if(controllo.equals("}"))
graf=false;
if(graf)
New+=controllo;
}//while
System.out.println(New);
}//main
}//classe
Assolutamente no, una regexp la usi come vuoi, il motore del matching delle regular expressione è potentissimo, dovresti mettertici e imparare ad usarle :) , prima magari però impara a leggere i javadoc alla ricerca delle funzioni che ti servono, ti sei fermato troppo presto.
Per la tua curiosità ecco qui
String regex="(?<=\\{)\\d+(?=\\})";
String s="abc de fg {456} hil 568 abc";
// fa lo split (quello richiesto dal thread starter
String[] sArray=s.split(regex);
for(String splitted : sArray){
System.out.println(splitted);
}
// prende solo 456 (questo è per farti capire)
Pattern p=Pattern.compile(regex);
Matcher m=p.matcher(s);
if(m.find()) System.out.println(m.group());
Ah altra cosa, le regexp sono anche molto veloci, molto di più dei magheggi che saresti costretto a fare tu per fare anche banali operazioni sul testo che non siano semplicemente dei replace di un paio di caratteri :)
Grazie dell'aiuto:
Funziona perfettamente :D
Inoltre leggendo tutti i post ho anche capito meglio l'argomento, ora credo che saprei creare le mie espressioni regolari in java.
Ringrazio anche tutti gli altri.
Ti facevo notare che ti eri fissato sulla funzione matches..., non stai ancora rispondendo...
che è vero che ti torna solo un boolean, ma è altrettanto vero che quella non serve per usare le regex come si deve, serve SOLO a sapere se c'è o no match. io fino a ieri sera il metodo matches non lo conoscevo neanche, l'ho trovato per caso. le espressioni regolari di per se' non c'entrano niente con Java, Java semmai ne fornisce solo una particolare implementazione; mettiti in testa che tu non conosci le espressioni regolari solo per aver usato delle classi J2SE.
le espressioni regolari di per se' servono solo a descrivere un linguaggio regolare, di conseguenza data un'espressione regolare e una stringa ció che é possibile fare é dire se quella stringa appartiene o meno al linguaggio regolare descritto; il motivo per cui é possibile fare ció é che i linguaggi regolari sono linguaggi riconoscibili, cioé linguaggi per i quali il problema del riconoscimento é decidibile (esistono altri linguaggi per i quali tale problema non é decidibile).
che poi la particolare implementazione di Java fornisca altri algoritmi, come ad esempio la ricerca di prefissi, suffissi e sottostringhe, é un altro discorso: questi algoritmi sono comunque basati sul problema del riconoscimento, cioé utilizzano una qualche procedura di riconoscimento che risponde solamente con un si o con un no; perché quello che puoi fare con le espressioni regolari é quello: riconoscere, punto.
Come dicevo è solo la piccolissima punta dell'iceberg, spesso infatti si utilizza una regexp per manipolare in tutto e per tutto del testo. come ho giá detto ci sono innumerevoli operazioni sulle stringhe che possono essere svolte facendo facilmente a meno delle espressioni regolari. un esempio che ho giá riportato é quello dei compilatori.
Buonanotte e buone vacanze (se stai andando in vacanza :D) grazie, comunque sto ancora a Roma, per "mare" intendevo Terracina :p
mettiti in testa che tu non conosci le espressioni regolari solo per aver usato delle classi J2SE.
Ti dico solamente che ieri per scriverti quel codice mi son dovuto andare a guardare come si usano le regex in java, visto che era la prima volta che le usavo.
Ho imparato ad usarle con javascript. tiè :D
DanieleC88
27-07-2010, 20:14
le espressioni regolari di per se' servono solo a descrivere un linguaggio regolare, di conseguenza data un'espressione regolare e una stringa ció che é possibile fare é dire se quella stringa appartiene o meno al linguaggio regolare descritto; il motivo per cui é possibile fare ció é che i linguaggi regolari sono linguaggi riconoscibili, cioé linguaggi per i quali il problema del riconoscimento é decidibile (esistono altri linguaggi per i quali tale problema non é decidibile).
Madonna, mi sembra di rileggere Michael Sipser! :D
Quando si dice che la precisione formale è tutto nella vita. :D
Grazie dell'aiuto:
Funziona perfettamente :D
Inoltre leggendo tutti i post ho anche capito meglio l'argomento, ora credo che saprei creare le mie espressioni regolari in java.
Ringrazio anche tutti gli altri.
Prego, almeno sto thread è servito a qualcosa!
Ti dico solamente che ieri per scriverti quel codice mi son dovuto andare a guardare come si usano le regex in java, visto che era la prima volta che le usavo.
Ho imparato ad usarle con javascript. tiè :D ah be', allora é tutto un altro paio di maniche, chiaro.
PS: per quella risposta che ancora mi devi non c'é problema, il non aver risposto é giá di per se' una risposta molto eloquente.
prima di arrivare a cosa? c'é qualche documentazione in javadoc che contraddice qualcosa che io ho scritto?
perché, al contrario, esiste molta letteratura che contraddice ció che tu hai scritto.
Ti facevo notare che ti eri fissato sulla funzione matches..., che è vero che ti torna solo un boolean, ma è altrettanto vero che quella non serve per usare le regex come si deve, serve SOLO a sapere se c'è o no match.
E' una limitazione, diciamo una abbreviazione di utilizzo della regex (presente in quasi tutti i linguaggi), visto che a volte ci si trova solo a dover sapere se un determinato gruppo di caratteri è presente in un altro gruppo
Come dicevo è solo la piccolissima punta dell'iceberg, spesso infatti si utilizza una regexp per manipolare in tutto e per tutto del testo.
La rispota te l'ho data, è quella, ora fammi vedere la letteratura che contraddice ciò che ho detto, considerando poi che non ho detto nulla di chè.
La rispota te l'ho data, è quella, veramente mi aspettavo un link a qualche javadoc, me lo sono perso?
ora fammi vedere la letteratura che contraddice ciò che ho detto, considerando poi che non ho detto nulla di chè. dispense del mio corso di Linguaggi e Compilatori: http://twiki.di.uniroma1.it/twiki/viewfile/LC/WebHome?rev=1;filename=LC-dispense.pdf
la prima parte tratta vari tipi di linguaggi (piu un po' di roba sugli automi finiti), tra cui quelli regolari, e alla fine tratta le espressioni regolari.
ti posto solamente questo link ma ti assicuro che molte delle nozioni contenute sono ben conosciute e potresti trovarle tali e quali in qualunque altra universitá.
DanieleC88
27-07-2010, 22:35
Oppure c'è il sempreverde Sipser. L'ho già nominato, non posso fare a meno adesso di linkarlo: http://www.amazon.com/Introduction-Theory-Computation-Michael-Sipser/dp/053494728X
veramente mi aspettavo un link a qualche javadoc, me lo sono perso?
dispense del mio corso di Linguaggi e Compilatori: http://twiki.di.uniroma1.it/twiki/viewfile/LC/WebHome?rev=1;filename=LC-dispense.pdf
la prima parte tratta vari tipi di linguaggi (piu un po' di roba sugli automi finiti), tra cui quelli regolari, e alla fine tratta le espressioni regolari.
ti posto solamente questo link ma ti assicuro che molte delle nozioni contenute sono ben conosciute e potresti trovarle tali e quali in qualunque altra universitá.
Ma che javadoc vuoi? Te ti eri fissato sul dire che con le regex ricavi solo un vero e falso, usando poi come tesi che la funzione matches ti torna soltanto un boolean, e io ti ho risposto che ti sei fermato troppo presto nella valutazione delle funzioni che utilizzano le regex, bona.
Non ho assolutamente voglia di leggermi una pappardella universitara, incollami il paragrafino che va contro a quello che ho detto? (ma cosa avrò detto poi?? :confused: )
DanieleC88
27-07-2010, 23:38
Non ho assolutamente voglia di leggermi una pappardella universitara, incollami il paragrafino che va contro a quello che ho detto?
Capitoli 4 e 5: si parla di automi a stati finiti e linguaggi regolari, dimostrando anche che questi due strumenti hanno la stessa capacità espressiva. Ciò equivale a dire che quel che puoi fare con gli automi a stati finiti lo puoi fare coi linguaggi regolari, e viceversa: ma, dal momento che l'automa a stati finiti riceve un input in ingresso e, tramite transizione di stati si giunge in uno stato di destinazione che può essere di accettazione o non accettazione, ciò che stai facendo è esattamente di formalizzare un linguaggio e verificare l'appartenenza o non appartenenza di una data stringa a tale linguaggio. Data l'equivalenza dei due strumenti, questo è esattamente lo stesso che farai con un'espressione regolare: né più, né meno. :)
ciao ;)
Capitoli 4 e 5: si parla di automi a stati finiti e linguaggi regolari, dimostrando anche che questi due strumenti hanno la stessa capacità espressiva. Ciò equivale a dire che quel che puoi fare con gli automi a stati finiti lo puoi fare coi linguaggi regolari, e viceversa: ma, dal momento che l'automa a stati finiti riceve un input in ingresso e, tramite transizione di stati si giunge in uno stato di destinazione che può essere di accettazione o non accettazione, ciò che stai facendo è esattamente di formalizzare un linguaggio e verificare l'appartenenza o non appartenenza di una data stringa a tale linguaggio. Data l'equivalenza dei due strumenti, questo è esattamente lo stesso che farai con un'espressione regolare: né più, né meno. :)
ciao ;)
Peccato che io lo dissi che si può ovviamente arrivare al medesimo risultato anche senza usare le regex ;)
E infatti ci sono state soluzioni in tal senso mi pare :)
Avete l'aria degli universitari che stan passando i primi esamini. Secondo me studiate troppo e ragionate poco. :)
ps. imparate le regex che vi fan bene, vedrete che vi saran utili anche se preferite scrivere righe e righe e righe di codice inutile.
DanieleC88
27-07-2010, 23:49
Sì, ma il punto della questione era diverso: è pacifico che se c'è una regex che riconosce un linguaggio, allora può essere formalizzato un automa a stati finiti (diciamo: algoritmo) che riconosce il corrispondente linguaggio. A partire da quello poi puoi fare qualcosa in più, come testare se una sottostringa appartiene ad un dato linguaggio e sostituirla con dell'altro testo, ma non è vero invece che la regex si occupa di fare questo: la regex definisce la struttura delle stringhe che appartengono ad un linguaggio, non le loro regole di sostituzione. :)
ciao ;)
Ma io non l'ho mai detto, o forse non ci siamo capiti, io ho sempre sostenuto che ci fai di tutto, ma mi pare ovvio che non è la regex intesa come
\ bla bla \
a farlo... questo è banale e l'ho specificato al mio secondo? post :)
Non capisco perchè state continuando a portare avanti una discussione sterile e inutile. :mc:
Tanto non le sapete usare quindi che vi frega di quel che ci si può fare o meno? ;)
Vi faccio notare che state cercando di spiegare a me come funzionano le regex quando io le uso quotidianamente in diversi linguaggi, mentre voi avete giusto letto quello scritto sulle dispense del vostro corso di laurea probabilmente senza capirci nulla.
DanieleC88
27-07-2010, 23:57
Avete l'aria degli universitari che stan passando i primi esamini. Secondo me studiate troppo e ragionate poco. :)
In realtà fero86 è già laureato, io spero di diventarlo fra un po'.
Fidati, non sono il tipo che studia troppo... :asd:
E nemmeno quello che ragiona poco.
ps. imparate le regex che vi fan bene, vedrete che vi saran utili anche se preferite scrivere righe e righe e righe di codice inutile.
Ehm... le regex le conosco, le ho usate, le uso... Dove hai letto che preferisco “scrivere righe e righe di codice inutile”? :wtf:
ciao ;)
DanieleC88
28-07-2010, 00:00
Tanto non le sapete usare quindi che vi frega di quel che ci si può fare o meno? ;)
E tu che ne sai? :)
Io mi sono spinto forse a giudicare le tue conoscenze? Non farlo tu delle mie. :)
Vi faccio notare che state cercando di spiegare a me come funzionano le regex quando io le uso quotidianamente in diversi linguaggi, mentre voi avete giusto letto quello scritto sulle dispense del vostro corso di laurea probabilmente senza capirci nulla.
Di nuovo, che ne sai se c'ho capito qualcosa o no? E se le ho usate o no?
Abbassa la cresta, su. :)
ciao ;)
astorcas
28-07-2010, 00:05
non voglio mettermi dalla parte di nessuno però secondo me siete un po' troppo formali, quando non ce n'è tutta sta necessità. E' vero una regular expression altro non è che una stringa che dovrebbe riconoscere un insieme di stringhe, e questo insieme è un linguaggio regolare. Ok ma è davvero così?
Questa
(.*)\1\1
è per qualsiasi motore di matching una regular expression, ma trovatemi un'automa a stati finiti che sia in grado di dirmi che "blablabla" sia presente nell'insieme descritto da questa regex.
Inoltre se si usassero solo per vedere se una parola sia o no "descritta" da una regex, a che servono i caratteri ^ e $ (inizio e fine parola)? Sarebbero ridondanti no? E i lookaround? ( (?<=c)ia(?=o) non dice che 'ciao' appartiene a un linguaggio o meno, ma che 'ia' viene catturato dalla regex).
Quello che voglio dire è: Ok la teoria ci dice che una regex rappresenta un linguaggio regolare, ma la pratica no.
My 2 cents....
non voglio mettermi dalla parte di nessuno però secondo me siete un po' troppo formali, quando non ce n'è tutta sta necessità. E' vero una regular expression altro non è che una stringa che dovrebbe riconoscere un insieme di stringhe, e questo insieme è un linguaggio regolare. Ok ma è davvero così?
Questa
(.*)\1\1
è per qualsiasi motore di matching una regular expression, ma trovatemi un'automa a stati finiti che sia in grado di dirmi che "blablabla" sia presente nell'insieme descritto da questa regex.
Inoltre se si usassero solo per vedere se una parola sia o no "descritta" da una regex, a che servono i caratteri ^ e $ (inizio e fine parola)? Sarebbero ridondanti no? E i lookaround? ( (?<=c)ia(?=o) non dice che 'ciao' appartiene a un linguaggio o meno, ma che 'ia' viene catturato dalla regex).
Quello che voglio dire è: Ok la teoria ci dice che una regex rappresenta un linguaggio regolare, ma la pratica no.
My 2 cents....
Non posso che concordare...
DanieleC88
28-07-2010, 00:18
[...]
Tutto giusto, e tutto fattibile sia tramite regex che automi. Certo, la pratica è importante, e lo so, fidati: ho iniziato da autodidatta a fare tutto, e solo ora sto studiando la teoria che c'è dietro...
Proprio perché mi sono reso conto dell'importanza della teoria, ti posso dire che non è buono capire come si fa una cosa senza capire perché, e la differenza tra una tecnica e le sue innumerevoli applicazioni.
Ed è solo questo che volevo sottolineare, ma mi si dà dell'ignorante gratuitamente. Vabbe'.
ciao ;)
Tutto giusto, e tutto fattibile sia tramite regex che automi. Certo, la pratica è importante, e lo so, fidati: ho iniziato da autodidatta a fare tutto, e solo ora sto studiando la teoria che c'è dietro...
Proprio perché mi sono reso conto dell'importanzza della teoria, ti posso dire che non è buono capire come si fa una cosa senza capire perché, e la differenza tra una tecnica e le sue innumerevoli applicazioni.
Ed è solo questo che volevo sottolineare, ma mi si dà dell'ignorante gratuitamente. Vabbe'.
ciao ;)
Con questo implicitamente affermi che io sappia la pratica ma non cosa ci sta dietro.
E non lo trovo giusto, visto che non conosci ne il mio percorso formativo ne quello lavorativo.
astorcas
28-07-2010, 00:22
Tutto giusto, e tutto fattibile sia tramite regex che automi. Certo, la pratica è importante, e lo so, fidati: ho iniziato da autodidatta a fare tutto, e solo ora sto studiando la teoria che c'è dietro...
Proprio perché mi sono reso conto dell'importanzza della teoria, ti posso dire che non è buono capire come si fa una cosa senza capire perché, e la differenza tra una tecnica e le sue innumerevoli applicazioni.
Ed è solo questo che volevo sottolineare, ma mi si dà dell'ignorante gratuitamente. Vabbe'.
ciao ;)
Lungi da me darti dell'ignorante, anzi ... (sei tu il "pazzo" (...invidia...) che ha scritto un os a 15 anni no? :) )
Comunque ti sei perso un pezzo cruciale:
(.*)\1\1
Puoi trovare un automa a stati finiti che accetti tale linguaggio? La risposta è no, quello in realtà non è un linguaggio regolare (e neanche context-free mi sa :fagiano:)
DanieleC88
28-07-2010, 00:23
Con questo implicitamente affermi che io sappia la pratica ma non cosa ci sta dietro.
E non lo trovo giusto, visto che non conosci ne il mio percorso formativo ne quello lavorativo.
Dopo quello che hai detto tu di me (gratuitamente), concedimelo. E visto che sto solo cercando di farti notare la definizione formale (e non altro) di ciò che usi giornalmente, e ti rifiuti di seguirmi nel discorso, non posso dire che tu non conosca le teorie che vi sono dietro ma mi lascio la libertà del dubbio.
Senza rancori verso nessuno, buonanotte. :)
ciao ;)
Dopo quello che hai detto tu di me (gratuitamente), concedimelo. E visto che sto solo cercando di farti notare la definizione formale (e non altro) di ciò che usi giornalmente, e ti rifiuti di seguirmi nel discorso, non posso dire che tu non conosca le teorie che vi sono dietro ma mi lascio la libertà del dubbio.
Senza rancori verso nessuno, buonanotte. :)
ciao ;)
Per me puoi avere tutti i dubbi che vuoi su quel che ti pare :)
buonanotte
DanieleC88
28-07-2010, 00:42
Lungi da me darti dell'ignorante, anzi ... (sei tu il "pazzo" (...invidia...) che ha scritto un os a 15 anni no? :) )
:doh:
Santo cielo, quand'è che ve ne dimenticherete? :asd:
EDIT: ecco, appunto, a ben pensarci: quel mio misero tentativo (poi risoltosi in un fallimento) non dimostra altro che l'avventurarmi nella pratica senza conoscere la teoria è stato un errore. :stordita:
Comunque ti sei perso un pezzo cruciale:
(.*)\1\1
Puoi trovare un automa a stati finiti che accetti tale linguaggio? La risposta è no, quello in realtà non è un linguaggio regolare (e neanche context-free mi sa :fagiano:)
Vero, ma cambia la natura del discorso? (Ovvero, oltre a riconoscere "blablabla", può sostituire quel testo con qualcos'altro? :))
Per me puoi avere tutti i dubbi che vuoi su quel che ti pare :)
buonanotte
Altrettanta libertà lascio a te. :)
ciao ;)
astorcas
28-07-2010, 01:04
....
Vero, ma cambia la natura del discorso? (Ovvero, oltre a riconoscere "blablabla", può sostituire quel testo con qualcos'altro? :))
...
Ovviamente, in senso stretto di definizione di regex, no! :)
Però ci sono millemila software (sed, grep, notepad++, visual studio, eclipse...), linguaggi di programmazione (esempio: c# ha nella classe Regex un metodo statico Replace....) il cui scopo è fortemente legato alla ricerca e/o sostituzione di stringe tramite regex. Detto questo, il succo del discorso è che alla fin fine qua nessuno dice cazzate e che siamo tutti d'accordo (più o meno) :D
Good night!
DanieleC88
28-07-2010, 01:06
Detto questo, il succo del discorso è che alla fin fine qua nessuno dice cazzate e che siamo tutti d'accordo (più o meno) :D
In effetti direi di chiuderla così che stiamo bene tutti! :D
ciao ;)
Se vogliamo dirla tutta la maggior parte dei linguaggi attuali non implementa nel modo migliore il riconoscimento delle regular expression (nel senso che potrebbe essere più performante).
Bisogna distinguere la teoria dietro le regex dall'uso che se ne fa poi in pratica.
Vincenzo1968
28-07-2010, 12:12
Se vogliamo dirla tutta la maggior parte dei linguaggi attuali non implementa nel modo migliore il riconoscimento delle regular expression (nel senso che potrebbe essere più performante).
Bisogna distinguere la teoria dietro le regex dall'uso che se ne fa poi in pratica.
*
http://swtch.com/~rsc/regexp/regexp1.html
Ma che javadoc vuoi? eh, lo so che non li trovi :asd:
recapitoliamo: dal momento che per te alcune cose che ho scritto sono sbagliate, fammi vedere una fonte affidabile (quale tu non sei) dove lo si possa constatare. mi pareva di aver capito che potevi fornirmi dei javadoc a tal proposito visto che mi hai detto che mi ero fermato troppo presto a leggerli.
Te ti eri fissato sul dire che con le regex ricavi solo un vero e falso, usando poi come tesi che la funzione matches ti torna soltanto un boolean, e io ti ho risposto che ti sei fermato troppo presto nella valutazione delle funzioni che utilizzano le regex, bona. grazie per aver palesato la tua ignoranza della terminologia relativa ai teoremi: quella che tu chiami tesi immagino che sarebbe una dimostrazione, ma in realtá era solo un esempio perché il prototipo di un metodo di una classe java di certo non dimostra un bel niente riguardo alle espressioni regolari.
Peccato che io lo dissi che si può ovviamente arrivare al medesimo risultato anche senza usare le regex ;) complimenti, hai vinto il premio 2010 per aver dato la risposta piu scorrelata mai letta. quello che voleva dire Daniele non é che le espressioni regolari non servono perché puoi usare anche un automa a stati finiti, rileggi bene il post.
E infatti ci sono state soluzioni in tal senso mi pare :) veramente no, non sarebbero state attinenti alla discussione.
Avete l'aria degli universitari che stan passando i primi esamini. Secondo me studiate troppo e ragionate poco. :) stendiamo un velo pietoso sull'aria che hai tu :asd:
ps. imparate le regex che vi fan bene, vedrete che vi saran utili anche se preferite scrivere righe e righe e righe di codice inutile. mi pareva di averti giá chiesto di finirla con la parte di quello che ha capito che non ci capiamo un cazzo, perché ti assicuro che stai del tutto sbagliando mira :stordita:
Non capisco perchè state continuando a portare avanti una discussione sterile e inutile. :mc: sterile e inutile per te sicuramente a quanto pare, ma la speranza é l'ultima a morire :asd:
Tanto non le sapete usare quindi che vi frega di quel che ci si può fare o meno? ;) non sei in grado di dire molto altro, vero? :)
Vi faccio notare che state cercando di spiegare a me come funzionano le regex quando io le uso quotidianamente in diversi linguaggi, ammazza quanto sei figo! :eek:
mentre voi avete giusto letto quello scritto sulle dispense del vostro corso di laurea probabilmente senza capirci nulla. il professore non la pensava cosi.
Non mi piacciono le discussioni che si basano su io so tutto e tu non sai un cavolo (da entrambe le parti). Chiudo perché non mi sembrate in grado di continuare senza entrare sul personale.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.