Oppure

Loading
30/10/11 21:12
Andrey_
Salve a tutti.

Qualcuno sa spiegarmi perché
expr match "Mono: Playback 64 [100%" '.*\([1]*[0-9]*[0-9]%\)'


mi restituisce '0%'?

Voglio ottenere '100%'. Qualche idea?

Grazie in anticipo a chiunque mi darà una mano.
Ultima modifica effettuata da Andrey_ 30/10/11 21:12
aaa
30/10/11 23:29
Andrey_
Mi scuso, il problema riguarda essenzialmente il funzionamento di expr, e lo riscontro anche in espressioni semplici come:

expr match "[100%]" ".*\([:digit:]*%\).*"

Probabilmente ora sarà più facile aiutarmi...

In sostanza expr ignora completamente [:digit:]* e mi restituisce soltanto %.

Oppure sono io scemo. :-|
Ultima modifica effettuata da Andrey_ 30/10/11 23:30
aaa
31/10/11 10:23
Il Totem
Ha ragione "lui" in entrambi i casi :D
Infatti nel primo caso hai specificato "[1]*[0-9]*[0-9]%", il che significa "zero o più 1, seguiti da zero o più cifre, seguite da una cifra, e poi un segno %". "0%" soddisfa l'espressione regolare nel caso in cui non ci siano occorrenze dei primi due gruppi.
Analogamente nel secondo caso, in cui [:digit:] può apparire zero o più volte. Ti matcha l'espressione in cui appare zero volte.

E' tuttavia curioso poiché, in genere, gli interpreti di espressioni regolari prendono dove possibile il match più lungo. Infatti esistono i quantificatori lazy, il cui scopo è far prendere esplicitamente i match più corti.
Secondo me potresti modificare il comportamento di default passando dei parametri a expr. Perché non usi grep?
aaa
31/10/11 16:47
pierotofy
expr match "[100%]" ".*\[\([:digit:]*%\)\].*"


* indica 0 o piu' occorrenze degli elementi nel set digit. "%" e' un valido match perche' ha 0 occorrenze. Specificando nell'espressione che il tutto dev'essere incluso tra parentesi quadre forza l'espressione ad includere anche il numero.
Il mio blog: piero.dev