[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

silly regex question

Joe Van Dyk

1/3/2006 10:22:00 PM

Can someone help me make this code not suck?

require 'test/unit'

# EWWWWWWW
def process_string str
result = Hash.new
str.to_a.each do |line|
line.scan(/important ([a-zA-Z0-9]+): /) do |key|
result[key.first] = line
end
end
result
end

class TestThis < Test::Unit::TestCase
def example_string
<<-END
# comments
important key1: some value's here
important key2: some value's here
important key3: some value's here
important key4: some value's here

other stuff we don't care about
END
end

def test_process_string
result = process_string example_string
assert 4, result.size
assert result.has_key?("key1")
assert result.has_key?("key2")
assert result.has_key?("key3")
assert result.has_key?("key4")
end
end


13 Answers

James Gray

1/3/2006 10:34:00 PM

0

On Jan 3, 2006, at 4:22 PM, Joe Van Dyk wrote:

> Can someone help me make this code not suck?

I guess it depends on what you mean by that...

> require 'test/unit'
>
> # EWWWWWWW
> def process_string str
> result = Hash.new
> str.to_a.each do |line|
> line.scan(/important ([a-zA-Z0-9]+): /) do |key|
> result[key.first] = line
> end
> end
> result
> end

def process_string str
Hash[*str.scan(/^\s*(important ([a-zA-Z0-9]+): .+)
$/).flatten.reverse]
end

James Edward Gray II


Joe Van Dyk

1/3/2006 10:41:00 PM

0

On 1/3/06, James Edward Gray II <james@grayproductions.net> wrote:
> On Jan 3, 2006, at 4:22 PM, Joe Van Dyk wrote:
>
> > Can someone help me make this code not suck?
>
> I guess it depends on what you mean by that...
>
> > require 'test/unit'
> >
> > # EWWWWWWW
> > def process_string str
> > result = Hash.new
> > str.to_a.each do |line|
> > line.scan(/important ([a-zA-Z0-9]+): /) do |key|
> > result[key.first] = line
> > end
> > end
> > result
> > end
>
> def process_string str
> Hash[*str.scan(/^\s*(important ([a-zA-Z0-9]+): .+)
> $/).flatten.reverse]
> end

IMO, my version's more readable. I'm going for readability here.


James Gray

1/3/2006 10:52:00 PM

0

On Jan 3, 2006, at 4:41 PM, Joe Van Dyk wrote:

> IMO, my version's more readable. I'm going for readability here.

def process_string str
result = Hash.new
str.scan(/^\s*(important ([a-zA-Z0-9]+): .+?)\s*$/) do |line, key|
result[key] = line
end
result
end

# ... or ...

def process_string str
str.inject(Hash.new) do |result, line|
result[$1] = line if line =~ /^\s*important ([^:]+):/
result
end
end

James Edward Gray II


Joe Van Dyk

1/3/2006 11:17:00 PM

0

Another silly regex question.

I have a regex that's getting to be more than 100 chars long. How can
I split it up on multiple lines?

Joe


Wilson Bilkovich

1/3/2006 11:24:00 PM

0

On 1/3/06, Joe Van Dyk <joevandyk@gmail.com> wrote:
> Another silly regex question.
>
> I have a regex that's getting to be more than 100 chars long. How can
> I split it up on multiple lines?
>
You can put the 'x' option on the end of the regular expression.
From the Pickaxe:
ExtendedMode: Complex regular expressions can be difficult to read. The x option
allows you to insert spaces, newlines, and comments in the pattern to
make it more
readable.

e.g.
%r{some regex
with
multiple
lines
}x


Dan Kohn

1/3/2006 11:27:00 PM

0

Here's a rails example for validating email addresses.

validates_format_of :login, :with => /
^[-^!$#%&'*+\/=?`{|}~.\w]+
@[a-zA-Z0-9]([-a-zA-Z0-9]*[a-zA-Z0-9])*
(\.[a-zA-Z0-9]([-a-zA-Z0-9]*[a-zA-Z0-9])*)+$/x,
:message => "must be a valid email address",
:on => :create

Joe Van Dyk

1/3/2006 11:41:00 PM

0

On 1/3/06, Wilson Bilkovich <wilsonb@gmail.com> wrote:
> On 1/3/06, Joe Van Dyk <joevandyk@gmail.com> wrote:
> > Another silly regex question.
> >
> > I have a regex that's getting to be more than 100 chars long. How can
> > I split it up on multiple lines?
> >
> You can put the 'x' option on the end of the regular expression.
> From the Pickaxe:
> ExtendedMode: Complex regular expressions can be difficult to read. The x option
> allows you to insert spaces, newlines, and comments in the pattern to
> make it more
> readable.
>
> e.g.
> %r{some regex
> with
> multiple
> lines
> }x

ah, nice. Too bad vim doesn't highlight the comments. :(


Chad Perrin

1/4/2006 12:42:00 AM

0

On Wed, Jan 04, 2006 at 07:51:55AM +0900, James Edward Gray II wrote:
>
> def process_string str
> str.inject(Hash.new) do |result, line|
> result[$1] = line if line =~ /^\s*important ([^:]+):/
> result
> end
> end

Not that I'm the one that has to read it, but . . .
I like this one for readability.

--
Chad Perrin [ CCD CopyWrite | http://ccd.ap... ]

unix virus: If you're using a unixlike OS, please forward
this to 20 others and erase your system partition.


Chad Perrin

1/4/2006 12:43:00 AM

0

On Wed, Jan 04, 2006 at 08:40:43AM +0900, Joe Van Dyk wrote:
>
> ah, nice. Too bad vim doesn't highlight the comments. :(

Have you tried setting this?:

:syntax on

--
Chad Perrin [ CCD CopyWrite | http://ccd.ap... ]

This sig for rent: a Signify v1.14 production from http://www.d...


Devin Mullins

1/4/2006 4:49:00 AM

0

Joe Van Dyk wrote:

>Can someone help me make this code not suck?
>
>require 'test/unit'
>
># EWWWWWWW
>def process_string str
> result = Hash.new
> str.to_a.each do |line|
> line.scan(/important ([a-zA-Z0-9]+): /) do |key|
> result[key.first] = line
> end
> end
> result
>end
>
>
def process_string str
result = {}
str.each_line do |line|
important_stuff = line.split(/important\s+/,2)[1] or next
key, value = important_stuff.split ':'
result[key] = value
end
result
end
# More readable? I dunno... you be the judge. I might prefer it over:
# line, key, value = line.match /important\s+(\w+):\s*(.*)$/
# Though the latter is much more explicit.

>class TestThis < Test::Unit::TestCase
> def example_string
> <<-END
> # comments
> important key1: some value's here
> important key2: some value's here
> important key3: some value's here
> important key4: some value's here
>
> other stuff we don't care about
> END
> end
>
> def test_process_string
> result = process_string example_string
> assert 4, result.size
> assert result.has_key?("key1")
> assert result.has_key?("key2")
> assert result.has_key?("key3")
> assert result.has_key?("key4")
> end
>end
>
>