Tim X
3/30/2007 4:45:00 AM
James Edward Gray II <james@grayproductions.net> writes:
> On Mar 29, 2007, at 4:46 PM, Jon wrote:
>
>> I absolutely cannot figure out why this does not find a match! I tried
>> searching this forum before I posted... I've been stuck for hours on
>> such a simple problem... I feel retarded.
>
> No need to feel bad. We will figure it out...
>
>> lines is an array of strings:
>>
>> def go(lines)
>> reg=/\[trace\-(\d+)\]/
>>
>> lines.each do |line|
>> puts line.slice!(0,25) #speed... some lines are long
>> puts reg.match(line)[1]
>> end
>> end
>>
>>
>> Here is an example string:
>>
>> [trace-2932] Application=3071000
>
> First, let's be sure the expression matches:
>
> >> "[trace-2932] Application=3071000" =~ /\[trace\-(\d+)\]/
> => 0
>
> Yep. That's not our problem.
>
> So let's look into what slice!() is doing to your String:
>
> >> str = "[trace-2932] Application=3071000"
> => "[trace-2932] Application=3071000"
> >> str.slice!(0, 25)
> => "[trace-2932] Application="
> >> str
> => "3071000"
>
> Bingo. That's the problem. See it now?
>
> Here is the documentation for slice!():
>
> $ ri -T String#slice!
> ---------------------------------------------------------- String#slice!
> str.slice!(fixnum) => fixnum or nil
> str.slice!(fixnum, fixnum) => new_str or nil
> str.slice!(range) => new_str or nil
> str.slice!(regexp) => new_str or nil
> str.slice!(other_str) => new_str or nil
> ------------------------------------------------------------------------
> Deletes the specified portion from _str_, and returns the portion
> deleted. The forms that take a +Fixnum+ will raise an +IndexError+
> if the value is out of range; the +Range+ form will raise a
> +RangeError+, and the +Regexp+ and +String+ forms will silently
> ignore the assignment.
>
> string = "this is a string"
> string.slice!(2) #=> 105
> string.slice!(3..6) #=> " is "
> string.slice!(/s.*t/) #=> "sa st"
> string.slice!("r") #=> "r"
> string #=> "thing"
>
> Hope that helps.
>
> James Edward Gray II
>
>
>
I would also recommend anchoring your regexp. In fact, you will probably get
better performance by anchoring your RE and removing the splice (unless the
lines are a *LOT* longer than your example line). If you anchor your regexp to
the beginning of the line, the engine will stop trying to match as soon as it
cannot match the [trace-. To do this, start the regexp with a ^ i.e.
/^\[trace\-....
Tim
--
tcross (at) rapttech dot com dot au