在红宝石中检查空格的最简单方法

Posted

技术标签:

【中文标题】在红宝石中检查空格的最简单方法【英文标题】: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?。) 【参考方案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 == ' '

【讨论】:

以上是关于在红宝石中检查空格的最简单方法的主要内容,如果未能解决你的问题,请参考以下文章

检查用户是不是更改了连续子表单记录集的最简单方法?

检查 JavaScript 中是不是存在深度嵌套对象属性的最简单方法是啥? [复制]

Meteor 模板:检查用户是不是登录的最简单方法是啥?

检查 VB.net 的 DataTable 中是不是存在值的最简单/最快的方法?

检查字符串是不是为空或为空的最简单方法

在红宝石中计算汉明距离的最有效方法?