[risolto]espressioni regolari, ottenere una parte di stringa
- UbuNuovo
- Imperturbabile Insigne

- Messaggi: 4457
- Iscrizione: sabato 12 dicembre 2009, 20:58
- Desktop: Mate
- Distribuzione: Ubuntu Mate 22.04.1 LTS
- Sesso: Maschile
- Contatti:
Re: [risolto]espressioni regolari, ottenere una parte di str
'.*' significa: qualsiasi serie di caratteri
"." un carattere qualsiasi
"*" ripetuto un qualsiasi numero di volte (0 o più volte).
ti ho fatto due esempi per farti vedere che puoi costruire $dopo in due modi:
modo 1)
dopo='.*/texture/dr.bmp'
in questo caso non inserisci '.*' nella riga di codice:
match=$( grep -oP "$prima\K(.*?)(?=/)(?=$dopo)" <(echo "$path") )
modo 2)
dopo='/texture/dr.bmp'
in questo caso inserisci '.*' nella riga di codice:
match=$( grep -oP "$prima\K(.*?)(?=/)(?=.*$dopo)" <(echo "$path") )
poi
la parte che rende sicuramente ungready il match è (.*?)(?=/)
in pratica viene presa la parte compresa da "$prima" fino alla prima barra (esclusi).
"." un carattere qualsiasi
"*" ripetuto un qualsiasi numero di volte (0 o più volte).
ti ho fatto due esempi per farti vedere che puoi costruire $dopo in due modi:
modo 1)
dopo='.*/texture/dr.bmp'
in questo caso non inserisci '.*' nella riga di codice:
match=$( grep -oP "$prima\K(.*?)(?=/)(?=$dopo)" <(echo "$path") )
modo 2)
dopo='/texture/dr.bmp'
in questo caso inserisci '.*' nella riga di codice:
match=$( grep -oP "$prima\K(.*?)(?=/)(?=.*$dopo)" <(echo "$path") )
poi
la parte che rende sicuramente ungready il match è (.*?)(?=/)
in pratica viene presa la parte compresa da "$prima" fino alla prima barra (esclusi).
Salva l'Ucraina! 
Re: [risolto]espressioni regolari, ottenere una parte di str
sì, ma qui $dopo vale necessariamente "/.*"
Sapendo questo, riformulo la domanda:
sia MATCH il valore che verrà estrapolato dalla stringa e salvato nella variabile $match
L'espressione regolare, una volta risolti $prima e $dopo è questa: "/usr/share/MATCH/.*"
Ora, ci sono alcune stringhe tipo "/usr/share/misqui/texture/dr.bmp" per dirne una, che possono matchare l'espressione regolare in due modi:
il punto asterisco è rosso, il MATCH è verde
modo [1] /usr/share/misqui/texture/dr.bmp
modo [2] /usr/share/misqui/texture/dr.bmp
Domanda: è sufficiente che nell'espressione regolare di grep compaia (?=/) per far sì che a MATCH venga associata la più corta stringa che soddisfa l'espressione regolare (e che quindi la stringa venga interpretata col modo [1] ), oppure alcune stringhe potrebbero anche essere interpretate usando il modo [2], cosa che farebbe non funzionare il programma?

Sapendo questo, riformulo la domanda:
sia MATCH il valore che verrà estrapolato dalla stringa e salvato nella variabile $match
L'espressione regolare, una volta risolti $prima e $dopo è questa: "/usr/share/MATCH/.*"
Ora, ci sono alcune stringhe tipo "/usr/share/misqui/texture/dr.bmp" per dirne una, che possono matchare l'espressione regolare in due modi:
il punto asterisco è rosso, il MATCH è verde
modo [1] /usr/share/misqui/texture/dr.bmp
modo [2] /usr/share/misqui/texture/dr.bmp
Domanda: è sufficiente che nell'espressione regolare di grep compaia (?=/) per far sì che a MATCH venga associata la più corta stringa che soddisfa l'espressione regolare (e che quindi la stringa venga interpretata col modo [1] ), oppure alcune stringhe potrebbero anche essere interpretate usando il modo [2], cosa che farebbe non funzionare il programma?
- UbuNuovo
- Imperturbabile Insigne

- Messaggi: 4457
- Iscrizione: sabato 12 dicembre 2009, 20:58
- Desktop: Mate
- Distribuzione: Ubuntu Mate 22.04.1 LTS
- Sesso: Maschile
- Contatti:
Re: [risolto]espressioni regolari, ottenere una parte di str
Forse sono io, ho il mal di testa... ma non ci capiamo granché
modo 1 e 2 devono dare lo stesso risultato!
Sono solo modi diversi di scrivere la stessa cosa!
Che ".*" arrivi dalla variabile o sia scritto nel codice non cambia nulla, usa la versione che ti resta più comoda.
metodo senza ".*" in $dopo (con '.*' nel codice)
metodo con ".*" in $dopo (quindi non nel codice)
i due metodi con $dopo che rappresenti qualsiasi path
metodo con ".*" in $dopo (quindi non nel codice)
metodo senza ".*" in $dopo (con '.*' nel codice)
modo 1 e 2 devono dare lo stesso risultato!
Sono solo modi diversi di scrivere la stessa cosa!
Che ".*" arrivi dalla variabile o sia scritto nel codice non cambia nulla, usa la versione che ti resta più comoda.
metodo senza ".*" in $dopo (con '.*' nel codice)
Codice: Seleziona tutto
8-) path="/usr/share/misqui/texture/dr.bmp"
8-) prima='/usr/share/'
8-) dopo='/texture/dr.bmp'
8-) match=$( grep -oP "$prima\K(.*?)(?=/)(?=.*$dopo)" <(echo "$path") )
8-) echo "$match"
misquiCodice: Seleziona tutto
8-) path="/usr/share/misqui/texture/dr.bmp"
8-) prima='/usr/share/'
8-) dopo='.*/texture/dr.bmp'
8-) match=$( grep -oP "$prima\K(.*?)(?=/)(?=$dopo)" <(echo "$path") )
8-) echo "$match"
misquimetodo con ".*" in $dopo (quindi non nel codice)
Codice: Seleziona tutto
8-) dopo='.*/.*'
8-) match=$( grep -oP "$prima\K(.*?)(?=/)(?=$dopo)" <(echo "$path") )
8-) echo "$match"
misquiCodice: Seleziona tutto
8-) dopo='/.*'
8-) match=$( grep -oP "$prima\K(.*?)(?=/)(?=.*$dopo)" <(echo "$path") )
8-) echo "$match"
misquiSiDomanda: è sufficiente che nell'espressione regolare di grep compaia (?=/) per far sì che a MATCH venga associata la più corta stringa che soddisfa l'espressione regolare.
Salva l'Ucraina! 
Re: [risolto]espressioni regolari, ottenere una parte di str
Non ci capiamo perché tu pensi che $dopo posso costruirmelo io in funzione della stringa da esaminare, in realtà non è così:
QUESTO È IMPORTANTE E IMPRESCINDIBILE
ovvero: non posso mettere /texture/dr.bmp né qualsiasi altro valore che non sia "/.*" in $dopo.
D'accordo?
Il mio dubbio deriva dal fatto che essendoci due "asterischi", alcune stringhe possono soddisfare l'espressione regolare in tanti modi.
modo [1] e [2] sono i modi in cui la stringa può matchare l'espressione regolare, e sono differenti banalmente perché in uno mi ritrovo "misqui" dentro $match (e mi ve bene) nell'altro mi ritrovo "misqui/texture" e non mi va bene.
Se, come penso di aver capito, il frammento di espressione regolare (?=$dopo) che viene risolto in (?=/.*) fa sì che dentro match venga salvata la più corta stringa di caratteri compresa fra $prima e $dopo, il mio programma funziona così, altrimenti dovrei modificarlo in modo da prendere $prima e $dopo il più lunghi possibili.
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^qui $dopo vale necessariamente "/.*"
QUESTO È IMPORTANTE E IMPRESCINDIBILE
ovvero: non posso mettere /texture/dr.bmp né qualsiasi altro valore che non sia "/.*" in $dopo.
D'accordo?
Il mio dubbio deriva dal fatto che essendoci due "asterischi", alcune stringhe possono soddisfare l'espressione regolare in tanti modi.
modo [1] e [2] sono i modi in cui la stringa può matchare l'espressione regolare, e sono differenti banalmente perché in uno mi ritrovo "misqui" dentro $match (e mi ve bene) nell'altro mi ritrovo "misqui/texture" e non mi va bene.
Se, come penso di aver capito, il frammento di espressione regolare (?=$dopo) che viene risolto in (?=/.*) fa sì che dentro match venga salvata la più corta stringa di caratteri compresa fra $prima e $dopo, il mio programma funziona così, altrimenti dovrei modificarlo in modo da prendere $prima e $dopo il più lunghi possibili.
- UbuNuovo
- Imperturbabile Insigne

- Messaggi: 4457
- Iscrizione: sabato 12 dicembre 2009, 20:58
- Desktop: Mate
- Distribuzione: Ubuntu Mate 22.04.1 LTS
- Sesso: Maschile
- Contatti:
Re: [risolto]espressioni regolari, ottenere una parte di str
Se guardi gli esempi che ho fatto il risultato, usando modo1 o 2, non cambia; ottengo sempre e solo "misqui" mai "misqui/texture".melfnt [url=http://forum.ubuntu-it.org/viewtopic.php?p=4608270#p4608270][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:modo [1] e [2] sono i modi in cui la stringa può matchare l'espressione regolare, e sono differenti banalmente perché in uno mi ritrovo "misqui" dentro $match (e mi ve bene) nell'altro mi ritrovo "misqui/texture" e non mi va bene.
Salva l'Ucraina! 
Re: [risolto]espressioni regolari, ottenere una parte di str
modo 1 o modo 2 non è che si "usano", sono solo due interpretazioni diverse per matchare la stessa espressione regolare.Se guardi gli esempi che ho fatto il risultato, usando modo1 o 2, non cambia; ottengo sempre e solo "misqui" mai "misqui/texture".
"/usr/share/MATCH/.*" può essere matchata in due modi (detti modo [1] e [2]) da "/usr/share/misqui/texture/dr.bmp", ti torna?
Vorrei avere la garanzia che grep interpreti la RE sempre nel solito modo: sostituendo MATCH con la stringa più corta e .* con quella più lunga.
- UbuNuovo
- Imperturbabile Insigne

- Messaggi: 4457
- Iscrizione: sabato 12 dicembre 2009, 20:58
- Desktop: Mate
- Distribuzione: Ubuntu Mate 22.04.1 LTS
- Sesso: Maschile
- Contatti:
Re: [risolto]espressioni regolari, ottenere una parte di str
modo 1 e 2 formano la stessa identica linea di codice, prova a sostituire il valore delle variabili nelle righe 'match=...'.
Salva l'Ucraina! 
Re: [risolto]espressioni regolari, ottenere una parte di str
Abbi pazienza, stavolta sono io che non capisco.

Abbiamo una linea di codice (dopo aver risolto $prima e $dopo):
Nella quale cui compare un'espressione regolare, della quale evidenzio due parti:
in verde ciò che successivamente verrà salvato dentro $match
in rosso il .*
e che quindi riscrivo così: "/usr/share/\K(.*?)(?=/.*)"
(1) Fin qui ti torna?
Bene, a questo punto proviamo a far matchare la stringa "/usr/share/misqui/texture/dr.bmp" con l'espressione regolare di cui sopra:
domanda: (2) come si comporta grep?
ovvero: quale parte della stringa associa al verde e quale al rosso?
Perché secondo me ci sono due modi:
modo [1]: /usr/share/misqui/texture/dr.bmp
modo [2]: /usr/share/misqui/texture/dr.bmp
che sono due interpretazioni ugualmente plausibili per la stessa espressione regolare, (3) ti torna?
Intendo, entrambe fanno matchare la stringa con l'espressione regolare, senza dover cambiare il codice.
Rispondi punto per punto, per favore.

Abbiamo una linea di codice (dopo aver risolto $prima e $dopo):
Codice: Seleziona tutto
match=$( grep -oP "/usr/share/\K(.*?)(?=/.*)" <(echo "$path") )
in verde ciò che successivamente verrà salvato dentro $match
in rosso il .*
e che quindi riscrivo così: "/usr/share/\K(.*?)(?=/.*)"
(1) Fin qui ti torna?
Bene, a questo punto proviamo a far matchare la stringa "/usr/share/misqui/texture/dr.bmp" con l'espressione regolare di cui sopra:
domanda: (2) come si comporta grep?
ovvero: quale parte della stringa associa al verde e quale al rosso?
Perché secondo me ci sono due modi:
modo [1]: /usr/share/misqui/texture/dr.bmp
modo [2]: /usr/share/misqui/texture/dr.bmp
che sono due interpretazioni ugualmente plausibili per la stessa espressione regolare, (3) ti torna?
Intendo, entrambe fanno matchare la stringa con l'espressione regolare, senza dover cambiare il codice.
Rispondi punto per punto, per favore.
Re: [risolto]espressioni regolari, ottenere una parte di str
Dai, per favore!
ti do tre buoni motivi:
1) è vero che non sono molto chiaro quando mi esprimo, però se fate così non imparerò mai a spiegarmi
2) magari sei tu che hai frainteso, se continuiamo la discussione forse riuscirai a comprendere ciò che ora non capisci
3) magari così il mio programma non funziona, qualcuno lo usa per implementare il software che gestisce un razzo, il razzo scoppia e moriamo tutti!

ti do tre buoni motivi:
1) è vero che non sono molto chiaro quando mi esprimo, però se fate così non imparerò mai a spiegarmi
2) magari sei tu che hai frainteso, se continuiamo la discussione forse riuscirai a comprendere ciò che ora non capisci
3) magari così il mio programma non funziona, qualcuno lo usa per implementare il software che gestisce un razzo, il razzo scoppia e moriamo tutti!
- vaeVictis
- Imperturbabile Insigne

- Messaggi: 4703
- Iscrizione: venerdì 27 luglio 2012, 17:58
- Desktop: Gnome
- Distribuzione: Ubuntu 20.04 64bit
Re: [risolto]espressioni regolari, ottenere una parte di str
A meno che il buon UbuNuovo non riesca a fartelo capire scrivendotelo in qualche altra lingua, le spiegazioni te le ha già date e anche più di una volta.
Continuare a parlarne in modo circolare non porta a una comprensione.
Prenditi del tempo, rifletti e magari tra qualche giorno ritorna a postare eventuali dubbi.
Così non stai andando da nessuna parte.
Valuta anche l'idea di provare a dare un'occhiata a qualche tutorial relativo alle espressioni regolari.
Su un forum si può aiutare, ma fino a una certa.
p.s.:
In quanto ai buoni motivi...
1) Non è chi ti aiuta a poterti spiegare come spiegarti. Al massimo ti si può dire che non sei chiaro, ti si può dare una mano, ti si può interpretare... ma la chiarezza è una cosa il cui onere dal mio punto di vista spetta a chi apre la discussione.
2) ...
3) È anche probabile che il razzo faccia la fine del cetriolo che sfugge di mano all'ortolano
Continuare a parlarne in modo circolare non porta a una comprensione.
Prenditi del tempo, rifletti e magari tra qualche giorno ritorna a postare eventuali dubbi.
Così non stai andando da nessuna parte.
Valuta anche l'idea di provare a dare un'occhiata a qualche tutorial relativo alle espressioni regolari.
Su un forum si può aiutare, ma fino a una certa.
p.s.:
In quanto ai buoni motivi...
1) Non è chi ti aiuta a poterti spiegare come spiegarti. Al massimo ti si può dire che non sei chiaro, ti si può dare una mano, ti si può interpretare... ma la chiarezza è una cosa il cui onere dal mio punto di vista spetta a chi apre la discussione.
2) ...
3) È anche probabile che il razzo faccia la fine del cetriolo che sfugge di mano all'ortolano
Ultima modifica di vaeVictis il lunedì 30 giugno 2014, 21:23, modificato 2 volte in totale.
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
- UbuNuovo
- Imperturbabile Insigne

- Messaggi: 4457
- Iscrizione: sabato 12 dicembre 2009, 20:58
- Desktop: Mate
- Distribuzione: Ubuntu Mate 22.04.1 LTS
- Sesso: Maschile
- Contatti:
Re: [risolto]espressioni regolari, ottenere una parte di str
È del tutto inutile che continui a ripetrti le stesse cose!
Fai delle prove e cerca di documentarti sulle espressioni regolari perl compatibili.
Usare codice senza avere un idea di come funzioni non ti insegna niente.
Quando avrai le idee più chiare fammi un fischio.

edit: Vae mi hai anticipato, stavo scrivendo
Fai delle prove e cerca di documentarti sulle espressioni regolari perl compatibili.
Usare codice senza avere un idea di come funzioni non ti insegna niente.
Quando avrai le idee più chiare fammi un fischio.
edit: Vae mi hai anticipato, stavo scrivendo
Salva l'Ucraina! 
Re: [risolto]espressioni regolari, ottenere una parte di str
Non è mica che parlo in modo circolare senza motivo.
I miei dubbi li ho espressi in tre punti in questo post.
Le idee chiare non ce le ho, altrimenti non sarei qui, soprattutto per quanto riguarda il modo in cui grep interpreta l'espressione regolare.
Ti ho detto che secondo me ci sono due modi per far matchare la stringa con la RE, e tu continui a ripetermi che "entrambi portano allo stesso risultato".
Al che ti ho fatto notare: "ma non è che posso scegliere quale modo usare cambiando il codice, sono semplicemente due modi in cui la stringa potrebbe venire associata alla RE" (la storia del rosso e del verde).
Il mio dubbio è: se non ho il controllo su cosa viene associato al verde e cosa al rosso, il mio programma potrebbe non funzionare.
Ti ripeto che non è una questione di codice che uso, lo stesso codice porta a due diverse interpretazioni.
Perciò provo a farti un altro esempio:
Abbiamo l'espressione regolare "uno \K(.*?)(?=tr.*)"
Come viene matchata con "uno due tre quattro"?
uno due tre quattro
uno due tre quattro
Se pensi di aver già risposto a questa domanda, potresti per favore linkarmela in questo topic?
I miei dubbi li ho espressi in tre punti in questo post.
Le idee chiare non ce le ho, altrimenti non sarei qui, soprattutto per quanto riguarda il modo in cui grep interpreta l'espressione regolare.
Ti ho detto che secondo me ci sono due modi per far matchare la stringa con la RE, e tu continui a ripetermi che "entrambi portano allo stesso risultato".
Al che ti ho fatto notare: "ma non è che posso scegliere quale modo usare cambiando il codice, sono semplicemente due modi in cui la stringa potrebbe venire associata alla RE" (la storia del rosso e del verde).
Il mio dubbio è: se non ho il controllo su cosa viene associato al verde e cosa al rosso, il mio programma potrebbe non funzionare.
Ti ripeto che non è una questione di codice che uso, lo stesso codice porta a due diverse interpretazioni.
Perciò provo a farti un altro esempio:
Abbiamo l'espressione regolare "uno \K(.*?)(?=tr.*)"
Come viene matchata con "uno due tre quattro"?
uno due tre quattro
uno due tre quattro
Se pensi di aver già risposto a questa domanda, potresti per favore linkarmela in questo topic?
- UbuNuovo
- Imperturbabile Insigne

- Messaggi: 4457
- Iscrizione: sabato 12 dicembre 2009, 20:58
- Desktop: Mate
- Distribuzione: Ubuntu Mate 22.04.1 LTS
- Sesso: Maschile
- Contatti:
Re: [risolto]espressioni regolari, ottenere una parte di str
Poi non intervengo più, ti ho detto su cosa documentarti, comunque...
Nel primo post di questa pagina:
Nel primo post di questa pagina:
L'interpretazione dell'espressione regolare è una soltanto!...
la parte che rende sicuramente ungready il match è (.*?)(?=/)
in pratica viene presa la parte compresa da "$prima" fino alla prima barra (esclusi).
Salva l'Ucraina! 
- UbuNuovo
- Imperturbabile Insigne

- Messaggi: 4457
- Iscrizione: sabato 12 dicembre 2009, 20:58
- Desktop: Mate
- Distribuzione: Ubuntu Mate 22.04.1 LTS
- Sesso: Maschile
- Contatti:
Re: [risolto]espressioni regolari, ottenere una parte di str
documentazione regex perl, in inglese e in italiano, quando hai appreso queste puoi farti tutte le regex che vuoi:
http://www.regular-expressions.info/tutorial.html
http://perldoc.perl.org/perlrebackslash.html
http://www.webalice.it/alanford/pcre.html
http://www.php.net/manual/it/reference. ... syntax.php
http://www.regular-expressions.info/tutorial.html
http://perldoc.perl.org/perlrebackslash.html
http://www.webalice.it/alanford/pcre.html
http://www.php.net/manual/it/reference. ... syntax.php
Salva l'Ucraina! 
Re: [risolto]espressioni regolari, ottenere una parte di str
@vaeVictis,UbuNuovo: Linkare manuali e documentazione è utile fino ad un certo punto, se l'utente continua a fare domande risposte alla RTFM sono inutili e mettergli di fronte chilometri di letteratura non lo aiuta. Se credete di aver dato il vostro apporto alla discussione non è necessario giustificarvi o fare altri interventi, diversamente, a costo di essere ripetitivi non guasta continuare a cercare di spiegare le cose all'utente, come da Regolamento (Sezione IV art 1,4,5 e soprattutto 8 ).
@melfnt Ve bene la curiosità ma non puoi pretendere che gli utenti ti spieghino per filo e per segno tutti gli esempi che tiri fuori, se vuoi imparare ci devi mettere del tuo.
@melfnt Ve bene la curiosità ma non puoi pretendere che gli utenti ti spieghino per filo e per segno tutti gli esempi che tiri fuori, se vuoi imparare ci devi mettere del tuo.
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Re: [risolto]espressioni regolari, ottenere una parte di str
@UbuNuovo: era quello che credevo di aver capito anche io (per questo ho messo [risolto]), però successivi interventi mi hanno fatto sorgere ulteriori dubbi.
@Zoff: d'accordo, ora che ho ottenuto le risposte che cercavo smetto di fare domande e mi metto a programmare.

Fra un po' vi posto un frammento di codice che spiega perché non posso risolvere il problema con "find" o "ls".

@Zoff: d'accordo, ora che ho ottenuto le risposte che cercavo smetto di fare domande e mi metto a programmare.
Fra un po' vi posto un frammento di codice che spiega perché non posso risolvere il problema con "find" o "ls".
Chi c’è in linea
Visualizzano questa sezione: 0 utenti iscritti e 3 ospiti

