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

J

Jon

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
 
T

Timothy Hunter

Jon said:
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.
 
J

James Edward Gray II

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
 
J

Jon Fi

Tim said:
James Edward Gray II said:
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... :(

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...
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,482
Members
44,901
Latest member
Noble71S45

Latest Threads

Top