【问题标题】:Ruby: if statement using regexp and boolean operatorRuby:使用正则表达式和布尔运算符的 if 语句
【发布时间】:2012-12-07 00:01:52
【问题描述】:

我正在学习 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

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

【问题讨论】:

  • 这确实属于 SO。一个很好的规则是,如果你在你的 IDE 前面,那么问题就属于 SO。如果您在白板前,它属于程序员。
  • 沃尔特,我相信你,但我不明白为什么它不属于“程序员”。我已经阅读了文档,您能帮帮我吗?
  • 作为参考,Ruby 有一个标准的内置语法来创建正则表达式。 commentline = /^;;/blankline = /^(\s*)$/ 在你的情况下。
  • @sawa - 哇,你在小学学过逻辑!!!我想我当时正在学习礼仪。

标签: ruby


【解决方案1】:

您需要使用 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

取决于你觉得哪个更易读

【讨论】:

  • 还有unless 方法。
  • 为了扩展@tadman 所说的内容,语法将变为unless (line !~ commentLine || line !~ blankline。这与否定整个if 声明相同(正如@ratchet 怪胎在他的示例中所做的那样) - 编辑:糟糕,看起来 Rachet 已经离开并更新了他的答案。
  • @KChaloux 在答案中补充说(我不太熟悉 ruby​​ 语法)
  • 感谢您的逻辑提醒,棘轮怪胎。你是对的。
【解决方案2】:

你可以写得更简洁,因为

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

__END__
;; alias filename backupDir

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

【讨论】:

  • 谢谢阿库恩。我放了这个的修改版本,它工作。我使用的示例是 MWE。当我将答案中的各种版本粘贴到我的代码中时,我使用了这个版本。顺便说一句,你知道为什么我的问题是从程序员那里迁移过来的吗?谢谢。
  • @bev 我猜这是因为您提出了非常具体的 API 问题,程序员更多的是关于如何准备工作谈话或版本控制的最佳实践等。
【解决方案3】:

这是你的代码:

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

【讨论】:

  • +1。不知道你可以在这样的大括号内使用正则表达式。
  • 注意 OP 在做什么。这与你正在做的事情不一样。你的是正确的。 OP 的条件总是返回 true,因为没有字符串可以同时匹配注释行和空白行。
  • 是的,或者使用固定字符串搜索,甚至在正则表达式中捕获单个元素。
  • @sawa:哦。哎呀。也许我应该“修复”我的也不能工作? :-)
  • 更多 Ruby,您可以使用多行字符串或 DATA 段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-02
  • 2016-08-27
  • 2013-12-31
  • 2015-01-07
  • 1970-01-01
  • 1970-01-01
  • 2020-09-17
相关资源
最近更新 更多