On 4/25/05, John W. Krahn <[EMAIL PROTECTED]> wrote:
> Owen wrote:
> > I found a message from Randal Schwartz, Message-ID:
> > <[EMAIL PROTECTED]>#1/1
> > which gave a regular expression for a valid Unix name,
> >
> > /^(?=.*?\D)[a-z\d]+$/
> >
> > That works but why does it work?
> >
> > /
> > ^ # Start of a string
> > (?= # 0 or 1 instance of
> > .*? # anything but a newline
> > \D # Non digit
> > ) #
> >
> > [a-z\d]+ # All match a-z and any digit at
> > $ # End of a string
> > /
> >
> >
> > I tried breaking it down like above but it still doesn't say "Must not be
> > all numbers and letters must be all lowercase"
> >
> > Any help in turning that re into plain words would be appreciated
>
> (?=.*?\D) is a zero-width assertion so it doesn't affect the match which is
> /^[a-z\d]+$/ -- match a string whose only characters are a-z0-9. When you add
> the zero-width assertion it ensures that there is at least one \D character in
> the match.
>
> John
I think this may be part of the confusion, too:
> > (?= # 0 or 1 instance of
> > .*? # anything but a newline
/.*?/ is not that same as /.?/. /.?/ matches zero or 1 of any
character but the newline. /.*?/, however, matches zero or more, just
like /.*/. It's non-greedy, though, so it will stop matching at the
first occurance of \D instead of the last. In this case it boils down
roughly to /(?=[^\D]{0,}\D/.
HTH,
--jay
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>