I found this regexp in the docs for the OptionParser class, and I don't understand it. Google hasn't helped, nor has the Pickaxe, so I thought I would ask here. The purpose of the code is to ensure that a file extension submitted by the user begins with a period (a dot).
file_ext.sub!(/\A\.(?=.)/, ".")
I understand all except (?=.) As far as I can tell the regexp works fine without it. I can delete the dot inside the parens, and the code still runs. I can change the = to a - and the code runs, but if I substitute a letter or a * instead, it doesn't.
Someone please clue me in here. What is this thing?
Check out Ruby | zenspider.com | by ryan davis for
details on this portion of the regex. It seems to involve look-ahead
capability.
HTH.
Steve Throckmorton wrote:
···
I found this regexp in the docs for the OptionParser class, and I don't
understand it. Google hasn't helped, nor has the Pickaxe, so I thought
I would ask here. The purpose of the code is to ensure that a file
extension submitted by the user begins with a period (a dot).
file_ext.sub!(/\A\.(?=.)/, ".")
I understand all except (?=.) As far as I can tell the regexp works
fine without it. I can delete the dot inside the parens, and the code
still runs. I can change the = to a - and the code runs, but if I
substitute a letter or a * instead, it doesn't.
Someone please clue me in here. What is this thing?
I found this regexp in the docs for the OptionParser class, and I don't
understand it. Google hasn't helped, nor has the Pickaxe, so I thought
I would ask here. The purpose of the code is to ensure that a file
extension submitted by the user begins with a period (a dot).
file_ext.sub!(/\A\.(?=.)/, ".")
I understand all except (?=.) As far as I can tell the regexp works
fine without it. I can delete the dot inside the parens, and the code
still runs. I can change the = to a - and the code runs, but if I
substitute a letter or a * instead, it doesn't.
Someone please clue me in here. What is this thing?
\A start of subject (independent of multiline mode)
(?= is a positive look ahead assetion
so \A the begining of the input \. is a literal . (and there must be
something more than that afterwords.
$ irb
re = /\A\.(?=.)/
=> /\A\.(?=.)/
re.match('abc')
=> nil
re.match('.')
=> nil
re.match('.a')
=> #<MatchData:0x40988d7c>
re.match('.123')
=> #<MatchData:0x409879a4>
re.match('..')
=> #<MatchData:0x409866a8>
···
On 7/17/06, Steve Throckmorton <nntp.m.ttwelve@xoxy.net> wrote:
--
Regards,
Jason
http://blog.casey-sweat.us/
file_ext.sub!(/\A\.(?=.)/, ".")
I understand all except (?=.)
That's a look-ahead assertion, ensuring there is at least one character following the period. Observe:
>> test = ".hidden_file"
=> ".hidden_file"
>> test.sub!(/\A\.(?=.)/, ".")
=> ".hidden_file"
>> test = "."
=> "."
>> test.sub!(/\A\.(?=.)/, ".")
=> nil
Hope that helps.
James Edward Gray II
···
On Jul 17, 2006, at 12:35 PM, Steve Throckmorton wrote: