Jak namatchovat \n na konci stringu?
Honza Pazdziora
adelton na fi.muni.cz
Středa Listopad 5 09:54:34 CET 2008
On Wed, Nov 05, 2008 at 09:43:54AM +0100, Pavel Smerk wrote:
> On Wed, Nov 05, 2008 at 09:22:45AM +0100, Jan Kasprzak wrote:
> > Pavel Smerk wrote:
> > : > Co znamena to "or"? Podle ceho se perl rozhodne, kterou z tech dvou variant
> > : > zvoli? Jak muzu rict, ze chci "at end of string", a nikoli "before newline
> > : > at the end"?
> >
> > A neni ten kdo zvoli primo programator pomoci /m ?
>
> Tomu asi nerozumim, perl -e 'print "ab\n" =~ /^.*?(.{0,1})$/' vypise vzdy
> "b" a nikdy "\n", nezavisle na pouzite "podmnozine" modifikatoru {/s, /m}.
>
> IOW, to /m v tomhle pripade nic neovlivni. Vzdy je to "before newline at the
> end". Naproti tomu pri =~ /^.*?(.{0,})$/ se vypise budto "ab", nebo "ab\n"
> podle toho, zda pouziju /s, /m opet nema zadny vliv, ani s /s, ani bez nej.
Duvodem je zpusob, jakym je ten regularni vyraz vyhodnocovan. Ten $
matchuje jak pred \n, tak za nim, a to matchovani vrati prvni uspesny
match. A /s rika, ze . nematchuje \n.
V prvnim pripade se ten match hleda odleva, od nejkratsiho (.{0,1} je
vlastne .?, a pred nim je non-greedy .*?), zatimco ve druhem pripade
se jede od nejdelsiho (.{0,} he to same jako .*) a dela se backtrace.
Doporucuji Jeffrey Friedl: Mastering Regular Expressions, je to tam
vysvetlene i s obrazky.
--
--------------------------------------------------------------------------
Honza Pazdziora | adelton na fi.muni.cz | http://www.fi.muni.cz/~adelton/
.project: Satellite, Spacewalk | Only self-confident people can be simple.
Další informace o konferenci Perl