File.open with line =~ /.../

Hi,

i have a txtfile like that =

bla1
foo=red

bla2
foo=green

bla3
foo=yellow

and i want to get i.e. bla1 and the corresponding value of foo

i tried with

File.open(“Y:/test/sample.txt”, “r”).each do |line|
puts $1<<’ : '<< $3 if line =~ /(\w+)\s+(\w+=)(\w+)/
end

but somehow the regex doesn’t work ?!
whereas it works in the QuickRex Plugin for Eclipse

Any ideas ?

Regards, Gilbert

On 23.02.2007 08:36, Rebhan, Gilbert wrote:

bla3
but somehow the regex doesn’t work ?!
whereas it works in the QuickRex Plugin for Eclipse

Any ideas ?

If this is really the case I’d say the QuickRex Plugin is broken or you
feed different files. Since you match for a non zero number of white
space characters before the equal sign, it should not match, since there
is none in the file contents you showed. You could change to \s* or
leave it out completely.

Kind regards

robert

Hi,

Hi,

Rebhan, Gilbert wrote:

bla3
but somehow the regex doesn’t work ?!
whereas it works in the QuickRex Plugin for Eclipse

Well… for each line of the file you are trying to match 2 lines.
That’s impossible :). Read the file in “paragraph mode” and match each
paragraph, or read it whole and scan it for your regexp.

For example (not tested):

File.read(’…’).scan(/^(\w+)\s*\n\w+=(\w+)$/) {|a,b| puts a+": "+b}

Good luck.

On Fri, Feb 23, 2007 at 04:36:05PM +0900, Rebhan, Gilbert wrote:

but somehow the regex doesn’t work ?!
whereas it works in the QuickRex Plugin for Eclipse

Any ideas ?

It’s because you’re only searching within each line individually,
whereas
your regexp matches ( word, space, word=word ) in one go. Using ‘each’
it
will be invoked first with “bla1\n” and then with “foo=red\n”, neither
of
which matches by itself.

If it’s a small file then just slurp it in all in one go:

ans = File.open(“sample.txt”).read.scan(/(\w+)\s+(\w+=)(\w+)/)
p ans

Your regexp works, but personally I would add some anchors, i.e.

ans = File.open(“sample.txt”).read.scan(/^(\w+)\s+(\w+=)(\w+)$/)
p ans

If you want to avoid reading the whole file in, there are more complex
solutions, e.g.

require ‘enumerator’
ans = File.open(“sample.txt”).each_cons(2) do |line1, line2|
next unless line1 =~ /^(\w+)$/
cat = $1
next unless line2 =~ /^(\w+)=(\w+)$/
puts “#{cat}: #{$1} => #{$2}”
end

HTH,

Brian.

On 23.02.2007 09:59, Rebhan, Gilbert wrote:

Hi,
foo=yellow
whereas it works in the QuickRex Plugin for Eclipse
*/
the regex
(\w+)\r\n(\w+=)(\w+) works in all implementations except the Awk
also the regex (\w+)\s+(\w+=)(\w+) works for all except the Awk
implementation

so i get = $1 > bla1 $2 >foo $3 > red with both regex

Did only simple regex operations on one line in ruby until now.
What’s wrong with my regex ?

Maybe I was too fast - I overlooked that you are trying to match
multiple lines. In that case of course you have to feed multiple lines

  • not a single line at a time as Carlos pointed out.

Kind regards

robert