以下代码打开一个文本文件做一个小的正则表达式来匹配名称和数字。我做一个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个数字
提前感谢您的帮助
答案 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