[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

Re: regular expressions and conditionals

Caleb Clausen

10/25/2008 11:02:00 PM

On 10/25/08, Matt Harrison <iwasinnamuknow@genestate.com> wrote:
> I'm writting a little program to convert some source files to html.
>
> I'm using regexp's to determine the content of each line and format it
> accordingly. For example, if the line starts with a #, then it should be
> output with a div (and id set to 'comment').
>
> The problem is with matching the regular expressions. If I do this:
>
> f = File.new("myfile", "r")
> while !f.eof?
> line = f.gets
>
> if line.match(/^# (.*)/)
> puts "<div id='comment'>#{line.match(/^# (.*)/)[0]}</div>"
> end
> end
>

I think what you're trying to write is a little more like this:
f = File.new("myfile", "r")
while line = f.gets
if line.match(/^# (.*)/)
line="<div id='comment'>#{line.chomp}</div>\n"
end
puts line
end

> Then not only do I get the commen lines formatted properly, I also get a
> "nil" for every other line in the file.

I didn't see any nils when I ran it... it just didn't print anything
but comments. Which would be because your original only printed lines
back out if they matched your comment pattern.

Why do you have a space after the # in your pattern? I've found it to
be good luck to always escape # when in regexps, even if it isn't
followed by a {. Probably a bug lurking in there.

1 Answer

Robert Klemme

10/26/2008 10:35:00 AM

0

On 26.10.2008 01:02, Caleb Clausen wrote:
> On 10/25/08, Matt Harrison <iwasinnamuknow@genestate.com> wrote:
>> I'm writting a little program to convert some source files to html.
>>
>> I'm using regexp's to determine the content of each line and format it
>> accordingly. For example, if the line starts with a #, then it should be
>> output with a div (and id set to 'comment').
>>
>> The problem is with matching the regular expressions. If I do this:
>>
>> f = File.new("myfile", "r")
>> while !f.eof?
>> line = f.gets
>>
>> if line.match(/^# (.*)/)
>> puts "<div id='comment'>#{line.match(/^# (.*)/)[0]}</div>"
>> end
>> end
>>
>
> I think what you're trying to write is a little more like this:
> f = File.new("myfile", "r")
> while line = f.gets
> if line.match(/^# (.*)/)
> line="<div id='comment'>#{line.chomp}</div>\n"
> end
> puts line
> end

Even better is

# Use the block form of File.open!
File.new("myfile", "r") do |f|
f.each do |line|
line.chomp!
case line
when /^# *(.*)/
puts "<div id='comment'># {$1}</div>"
else
puts line
end
end
end

or, for that matter

File.foreach("myfile") do |line|
line.chomp!
case line
when /^# *(.*)/
puts "<div id='comment'># {$1}</div>"
else
puts line
end
end

Kind regards

robert