Portál AbcLinuxu, 26. dubna 2024 17:27


Dotaz: Hladové regexpy

6.1.2005 16:32 Lukáš Zapletal | skóre: 42 | blog: lzapův svět | Olomouc
Hladové regexpy
Přečteno: 137×
Odpovědět | Admin
DD,

mám otázku ohledně Perlu. V jakém pořadí vyhodnocuje logickým NEBO spojený výraz? Příklad:
if ("te tea teta" =~ /(t|te).*/) {
	print $1;
} else {
	print "NE";
}
vrátí "t". Jaktože ale zde neplatí "hladové" pravidlo, kdy se Perl snaží vyhovět co nejširší odpovědi?

Druhá otázka. Je někde stanoveno, jakým směrem má vybírat při postupu? Myslím tím, jestliže kdybych seřadil ten regulární výraz od nejdelšího k nejkratšímu (te|t), tak jestlipak budu mít zaručeno, že se dříve najde "te"?

Snad jsem k pochopení :-)
Later --- Lukáš Zapletal
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

6.1.2005 16:41 Lukáš Zapletal | skóre: 42 | blog: lzapův svět | Olomouc
Rozbalit Rozbalit vše Re: Hladové regexpy
Odpovědět | | Sbalit | Link | Blokovat | Admin
Teda abych se vymáčk...

Potřebuji sestrojit regexp, který by mi našel nejdelší přefix pro určité slovo. Například pro slovo "vykopat" by hledal předpony "v, vy, vyko" a našel by tu nejdelší - vyko.

Jelikož by to šlo řešit regulárním automatem, tak by to snad mělo jít i řešit regulárním výrazem... :-)
Later --- Lukáš Zapletal
6.1.2005 17:23 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Re: Hladové regexpy
OR matchuje kdo první přijde, první mele.
6.1.2005 17:27 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Re: Hladové regexpy
Další možnost je (v(y(ko)?)?), ale vnitřní skupiny by musely být nečíslované, aby se v tom vyznalo alespoň prase, což v perlu nevím z hlavy, ale je to v manu (proč sakra perl nemá v regulárních výrazech pojmenované skupiny jako python?).
6.1.2005 17:28 Michal Marek (twofish) | skóre: 55 | blog: { display: blog; } | Praha
Rozbalit Rozbalit vše Re: Hladové regexpy
A přitom (e)grep se chová jinak :-(
$ echo "ahoj vole" | perl -e 'if (<> =~ /^(a|ah|aho|ahoj)/) {print "$1\n";}'
a
$ echo "ahoj vole" | grep -Eo '^(a|ah|aho|ahoj)'
ahoj
6.1.2005 17:34 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Re: Hladové regexpy
Tak to je rána pod pás, myslel jsem, že je to tak všude...

Python, vim -- kdo první přijde.

sed -- nejdelší (bez -r i s ním).
6.1.2005 18:04 ivok
Rozbalit Rozbalit vše Re: Hladové regexpy
Ale muzete ho taky prinutit, aby se choval stejne :-)
[ivok@zero ivok]$ echo "ahoj vole" | grep -Po '(a|ah|aho|ahoj)'
a
6.1.2005 17:32 ivok
Rozbalit Rozbalit vše Re: Hladové regexpy
Odpovědět | | Sbalit | Link | Blokovat | Admin
kousek z man perlre
Alternatives are tried from left to right, so the first alternative
found for which the entire expression matches, is the one that is cho-
sen. This means that alternatives are not necessarily greedy. For exam-
ple: when matching "foo|foot" against "barefoot", only the "foo" part
will match, as that is the first alternative tried, and it successfully
matches the target string. (This might not seem important, but it is
important when you are capturing matched text using parentheses.)
experimenátlní potvrzení :-)

[ivok@zero ivok]$ perl -e 'print "$1\n" if ("te tea teta" =~ /(te|t)/)'
te
[ivok@zero ivok]$ perl -e 'print "$1\n" if ("te tea teta" =~ /(t|te)/)'
t
takže: ano, není to greedy, a ano, máte zaručeno, že se matchuje v alternativách zleva doprava. aspoň v té verzi perlu, co tu mám já (5.8.5) :-)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.