【发布时间】:2012-05-08 08:29:49
【问题描述】:
我试图使用gsub 删除rails 应用程序中字符串中的非单词字符。我使用了以下代码:
somestring.gsub(/[\W]/i, '') #=> ""
但它实际上是不正确的,它也会删除字母k。正确的应该是:
somestring.gsub(/\W/i, '') #=> "kkk"
但我的问题是包含上述代码的rails控制器的单元测试使用rspec不起作用,单元测试实际上通过了。所以我在 rspec 中创建了一个非常极端的测试用例
it "test this gsub" do
'kkk'.gsub(/[\W]/i, '').should == 'kkk'
end
上面的测试用例应该失败,但它实际上通过了。这里有什么问题?为什么会通过测试?
【问题讨论】:
-
为什么测试会失败?据我所知,
/[\W]/i是该任务的完全有效的正则表达式。在这种情况下,括号是不必要的,但它不会伤害任何东西。 -
您是否真的在
irb中尝试过您的正则表达式?"kkk".gsub(..)正常工作,结果是“kkk”,所以测试通过了。你期待的结果是什么? -
@Casper 实际上,当运行
'kkk'.gsub(/[\W]/i, '')时,我得到""。相比之下,运行'kkk'.gsub(/\W/i, '')会返回"kkk"。 -
哎呀?
k是一个“单词”字符。\W匹配 non-word 字符。在我的 Ruby 安装中,当在irb中运行时,我得到了"kkk"。 -
看起来像。但是,如果您删除
/i标志,一切都会正常工作。你真的需要非单词字符的忽略大小写标志吗?
标签: ruby regex rspec ruby-1.9 gsub