Ruby:if语句使用regexp和boolean operator

时间:2012-12-07 00:01:53

标签: ruby

我正在学习Ruby并且未能使复合'if'语句起作用。这是我的代码(希望自我解释)

commentline = Regexp.new('^;;') 
blankline = Regexp.new('^(\s*)$')

if (line !~ commentline || line !~ blankline)
  puts line
end

变量'line'来自阅读以下文件:

;; alias filename backupDir

Prog_i  Prog_i.rb ./store
Prog_ii Prog_ii.rb ./store

这失败了,我不知道为什么。基本上我希望在处理文件中的行时忽略注释行和空行。谢谢你的帮助。

3 个答案:

答案 0 :(得分:6)

你需要使用AND

基本上您希望not (blank or comment)在应用DeMorgan之后转为not blank and not comment

if (line !~ commentline && line !~ blankline)
  puts line
end

unless(line ~= commentline || line ~= blankline)
  puts line
end

取决于您发现哪些更具可读性

答案 1 :(得分:1)

你可以写得更加简洁,如

puts DATA.readlines.reject{|each|each =~ /^;;|^\s*$/}

__END__
;; alias filename backupDir

Prog_i  Prog_i.rb ./store
Prog_ii Prog_ii.rb ./store

答案 2 :(得分:1)

这是你的代码:

commentline = Regexp.new('^;;') 
blankline = Regexp.new('^(\s*)$')

if (line !~ commentline || line !~ blankline)
  puts line
end

以及我如何写同样的事情:

[
  ';; alias filename backupDir',
  '',
  'Prog_i  Prog_i.rb ./store',
  'Prog_ii Prog_ii.rb ./store'
].each do |line|

  puts line if (!line[/^(?:;;)?$/])

end

哪个输出:

;; alias filename backupDir
Prog_i  Prog_i.rb ./store
Prog_ii Prog_ii.rb ./store