Regex problem... Tried Searching forum already... :(

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.

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

I get this:
undefined method `[]' for nil:NilClass (NoMethodError)
on the reg.match[1] line.

thanks for looking

···

--
Posted via http://www.ruby-forum.com/.

Jon wrote:

     puts reg.match(line)[1]

Try this:

  puts line.match(reg)[1]

The #match method is in String, not Regexp.

-Drew

Jon wrote:

I get this:
undefined method `' for nil:NilClass (NoMethodError)
on the reg.match[1] line.
  

Is is possible that you have a string that doesn't match? In that case match will return a nil object.

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

···

On Mar 29, 2007, at 4:46 PM, Jon wrote:
------------------------------------------------------------------------
      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

Drew Raines wrote:

Jon wrote:

     puts reg.match(line)[1]

Try this:

  puts line.match(reg)[1]

The #match method is in String, not Regexp.

Actually, that's not correct. I didn't realize there's a
Regexp#match too that works similarly. Besides, your exception would
have been different had that been the case.

The simplest answer is that your regexp isn't getting matched, so
#match isn't returning a MatchData object. You'll have to figure out
why.

-Drew

James Edward Gray II <james@grayproductions.net> writes:

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

···

On Mar 29, 2007, at 4:46 PM, Jon wrote:

--
tcross (at) rapttech dot com dot au

Tim X wrote:

James Edward Gray II <james@grayproductions.net> writes:

  def go(lines)

      if the value is out of range; the +Range+ form will raise a
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

The proper use of slice fixed it! I knew it was something retarded-ly
simple... :frowning:

I really appreciate your help everyone. The energy behind this language
is amazing. Thanks for helping a stupid noob!

Also the anchoring note... Good call. I'm am actually parsing a
proprietary message framework. Some of the lines will be megabytes in
length...

···

--
Posted via http://www.ruby-forum.com/\.