【问题标题】:simplest way to check for just spaces in ruby在红宝石中检查空格的最简单方法
【发布时间】:2011-01-31 21:10:33
【问题描述】:

所以我在 ruby​​ 中知道 x.nil?将测试 x 是否为空。

测试 x 是否等于 ' ' 或 ' '(两个空格)或 ' '(三个空格)等的最简单方法是什么?

基本上,我想知道测试变量是否全是空格的最佳方法是什么?

【问题讨论】:

  • 让我真正澄清我的问题,因为它并不完全清楚......我实际上是在 if 语句的上下文中执行这个。因此我检查 x.nil?而且我还希望 x.(这里只有空格,所以我认为它为零)都被有条件地评估
  • @user301752 当您说nil 时,您的意思是一个空字符串吗?它们在 Ruby 中是不一样的。 (打开irb 会话并检查:x = ''; x.nil?。)

标签: ruby conditional testing spaces


【解决方案1】:
a = "  " 

a.each_byte do |x|
  if x == 32
    puts "space"
  end
end

【讨论】:

  • 对于反对者,最好知道答案有什么问题(或者这怎么没用)
  • 我不是反对者,但这既不是最简单的解决方案,也不是检查 32 来捕获所有空白。
  • 关于他是否想要空格或所有空白字符(包括制表符、换行符等)的问题含糊不清。
【解决方案2】:

如果x 全是空格,那么x.strip 将是空字符串。所以你可以这样做:

if not x.nil? and x.strip.empty? then
    puts "It's all whitespace!"
end

或者,使用正则表达式,x =~ /\S/ 将返回 false 当且仅当 x 是所有空白字符:

if not (x.nil? or x =~ /\S/) then
    puts "It's all whitespace!"
end

【讨论】:

  • Mladen 指的是对您的答案投反对票,而不是指责您投反对票。
  • 对,抱歉不清楚。 @miorel,你有我的 +1,这两个都是很酷的想法,你甚至可以在后者中使用 !~ 并直接得到布尔结果。
  • 严格来说/\S/ 并没有告诉你字符串都是空格。它确定字符串中是否有任何 不是 空格的内容。这有时可能很重要 - 至少,如果您认为空字符串与全为空格的字符串不同。
【解决方案3】:
s =~ /\A\s*\Z/

正则表达式解决方案。这是short ruby regex tutorial

【讨论】:

  • 谢谢!刚开始学习 ruby​​ 并没有意识到 =~ 会有条件地评估非常甜蜜的正则表达式
  • @Stefan 我想你想要/^\s+$/ 因为* 会匹配太多(例如,你得到一个空字符串的匹配 - 根本没有空格)。
  • 我认为 '' 都是空格。这在问题的领域中可能正确,也可能不正确,但我认为问题的措辞不会使 * 或 + 不正确。
  • 最好使用锚点 \A\Z 而不是 ^$ -- 字符串 "abc\n \ndef" 将匹配您的正则表达式。
  • @StefanKendall 链接已损坏
【解决方案4】:

根据您的评论,我认为您可以扩展 String 类并定义 spaces? 方法,如下所示:

$ irb
>> s = " "
=> " "
>> s.spaces?
NoMethodError: undefined method `spaces?' for " ":String
    from (irb):2
>> class String
>>     def spaces?
>>         x = self =~ /^\s+$/
>>         x == 0
>>     end
>> end
=> nil
>> s.spaces?
=> true
>> s = ""
=> ""
>> s.spaces?
=> false
>> 

【讨论】:

    【解决方案5】:

    “最佳”取决于上下文,但这里有一个简单的方法。

    some_string.strip.empty?
    

    【讨论】:

      【解决方案6】:

      如果你使用 Rails,你可以简单地使用:

      x.blank?
      

      当 x 为 nil 时调用它是安全的,如果 x 为 nil 或全是空格,则返回 true。

      如果您不使用 Rails,可以从 activesupport gem 获取。使用gem install activesupport 安装。在您的文件中,require 'active_support/core_ext 获取基类的所有活动支持扩展,或 require 'active_support/core_ext/string' 仅获取 String 类的扩展。无论哪种方式,blank? 方法都将在需要之后可用。

      【讨论】:

      • 顺便说一句,我向 Rubyists 道歉,因为他们将 Rails 拖入了原本不错的纯 Ruby 讨论中。这只是一个很好的模仿模式。
      • @david-miani 很遗憾,我无法为您的编辑 +1,因为它非常棒。当 AS 已经支持包括您需要的功能时,从 ActiveSupport 中提取代码是一种糟糕的过度优化。
      【解决方案7】:

      又一个 :) string.all? { |c| c == ' ' }

      【讨论】:

        猜你喜欢
        • 2011-02-28
        • 1970-01-01
        • 2010-12-06
        • 2014-11-15
        • 1970-01-01
        • 2011-05-24
        • 2015-03-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多