在红宝石中检查空格的最简单方法
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 中是不是存在深度嵌套对象属性的最简单方法是啥? [复制]