From: Tim X Date: 2007-03-30T13:50:05+09:00 Subject: Re: Regex problem... Tried Searching forum already... :( James Edward Gray II 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