konkretni problem regexp (sed)

Martin Povolný xpovolny na aurora.fi.muni.cz
Sobota Červen 7 19:55:48 CEST 2003


Dne: Sat, Jun 07, 2003 at 04:47:30PM +0000, Michal Kubecek napsal:
> On Sat, Jun 07, 2003 at 04:34:49PM +0200, Michal Bozon wrote:
> > Zdravim.
> > 
> > Mam nasledujici problem se sed, mozna ze neco spatne chapu, ale...
> > Modelovy pripad:
> > chci vyextrahovat prvni souvislou radu cisel z retezce, napriklad
> > "as-dff42583f_sd" -> "42583"
> > 
> > $ echo "as-dff42583f_sd" | sed 's/.*\([0-9]\+\).*/\1/'
> > 3

ta prvni hvezdicka je hladova, nejprve zpapa uuuplne vsechno a pak
se backtrackuje postupne zpet

takze nejen ze to nefunguje, ale jeste je to neefektivni :-)

> > 
> > napravit to jde takhle:
> > 
> > $ echo "as-dff42583f_sd" | sed 's/.*[^0-9]\([0-9]\+\).*/\1/'
> > 42583
> > 
> > Proc nedostanu stejny vysledek i v prvnim propade? Jedna se pri
> > vyhodnocovani .* a [0-9]\+ k nejakemu stretu zajmu? Existuje jistejsi
> > zpusob reseni meho problemu?
> 
> Protože v prvním případě to opravdu není jednoznačné: vy si sice

jednoznacne to je (hladova hvezdicka proste zhltne co muze), jen to
nedela, co autor ocekaval

> představujete, že úvodní '.*' reprezentuje 'as-dff', ale ono to zrovna tak
> dobře může být tak, že '.*' -> 'as-dff4258' a a '[0-9]+' -> '3'.
> Pokud si dobře vzpomínám, v případě nejednoznačnosti má přednost ta část,
> která je dřív, v tomto případě '.*'. Ve druhém případě už jste
> nejednoznačnost vyloučil, takže sed nemá na výběr.

jak jsem napsal vyse -- nejde o nejednoznacnost, ale 'hladovost'

napriklad v perlu, nebo ruby existuje jeste 'stridma' verze hvezdicky
(nejen), ktera se pise "*?", a matchuje nejmensi mozny pocet znaku

takze by slo psat neco jako 's/.*?\([0-9]\+\).*/\1/'

-- 
Martin Povolný, xpovolny na fi.muni.cz, http://www.fi.muni.cz/~xpovolny


Další informace o konferenci Linux