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