【发布时间】:2017-10-22 06:59:04
【问题描述】:
[[:punct:]] 在 Rails 模型测试调用时不匹配任何标点符号。使用以下代码
test "punctuation matched by [[:punct:]]" do
punct_match = /\A[[:punct:]]+\Z/.match('[\]\[!"#$%&\'()*+,./:;<=>?@\^_`{|}~-]')
puts punct_match
puts punct_match.class
end
这会输出一个不可打印的字符和 NilClass。
但是,如果我执行相同的语句
punct_match = /\A[[:punct:]]+\Z/.match('[\]\[!"#$%&\'()*+,./:;<=>?@\^_`{|}~-]')
in irb 匹配正确并输出
[\]\[!"#$%&'()*+,./:;<=>?@\^_`{|}~-]
=> nil
我错过了什么?
Ruby 版本 => 2.2.4, Rails 版本 => 4.2.6
【问题讨论】:
-
你在 irb 中究竟输入了什么?
-
输入:punct_match = /\A[[:punct:]]+\Z/.match('[][!"#$%&\'()*+,./:; ?@\^_
{|}~-]') output: #<MatchData "[\\]\\[!\"\#$%&'()*+,./:;<=>?@\\^_{|}~-]"> -
使用 MRI v2.2.4?我试过这个,没有匹配。无法复制。
-
啊,等一下。您使用的是 Ruby
2.4而不是2.2,不是吗?这个正则表达式的行为确实发生了变化。您的 rails vs pry 环境使用不同的 ruby 版本。 -
哇!铁轨不是宝石吗?它应该使用与您所知道的 ruby 相同的 ruby。
标签: ruby regex unit-testing ruby-on-rails-4