不能放出多行

时间:2010-09-27 22:41:07

标签: ruby

以下代码打开一个文本文件做一个小的正则表达式来匹配名称和数字。我做一个IF,所以我只匹配大于0的数字。当我尝试输入名称和数字时,我只得到数字,名称变为零。如果我在if语句之前放置名称(变量a),它就在那里。我做错了什么?

nf = File.open("textfile.txt")

nf.each do |b|
 a = b.match(/([\S]+)name([\S]+)/)
 c = b.match(/[0-9]+ numbers/)
 c = c.to_s.split(/ /)
 c = c[0].to_i
  if c > 0
   puts a
   puts c
  end 
 end

textfile如下所示:

我的名字是马克 12432个号码 我叫乔 0个数字

我希望能够提出:
我的名字是马克 12432号码

不打印出来:
我叫乔 0个数字

提前感谢您的帮助

3 个答案:

答案 0 :(得分:1)

那么有四行。在第1行和第3行有一个名字,所以a不会是零。但是c > 0将是假的,因此不会打印任何内容。

在第2行和第4行没有名称,因此a为零。

修改:/([\S]+)name([\S]+)/在您的示例文件中永远不会匹配,因为“name”被空格包围(\S表示“空格”)。< / p>

Edit2:这是使用scan

的解决方案
File.read("textfile.txt").scan(/My name is (\w+)\n(\d+) numbers/) do |name, num|
  num = num.to_i
  if num > 0
    puts "Name: #{name}"
    puts "Number: #{num}"
  end
end

答案 1 :(得分:0)

问题在于您尝试在同一行中匹配名称数字

一个有效的快速脚本,在irb中测试:

File.open("foo", "r") do |file|
  while name_line = file.gets
    if name_line =~ /\s+name\s+/
      number_line = file.gets # Here we read onto the next line
      if match = number_line.match(/(\d+) numbers/)
        # If matches, it will keep the number in the first capture group
        puts name_line, match[1] if match[1].to_i > 0
      end
    end
  end
end

请注意,如果两个连续的行匹配“name”而第三个行具有“数字”,则不起作用,这可能不是这种情况

答案 2 :(得分:-1)

p=""
File.readlines("file").each do |line|
  num = line.split[0]
  if num.to_i > 0
    print "#{p}#{line}"
  else
    p=line
  end
end