[[:p unct:]] 在 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('[][!"#$%&'()*+,./:;<=>?@^_`{|}~-]')
在 IRB 中正确匹配并输出
[][!"#$%&'()*+,./:;<=>?@^_`{|}~-]
=> nil
我错过了什么?
红宝石版本 => 2.2.4,导轨版本 => 4.2.6
/[[:punct:]]/
的行为在 ruby 版本 2.4.0
中略有变化。
此错误是在 ruby 问题中提出的,它链接回 Onigmo 中的这个(更古老的(问题 - 自 Ruby 2.0+
以来使用的正则表达式引擎。
简短的回答是,这些字符在 ruby 版本 <2.4.0
中与 /[[:punct:]]/
不匹配,现在匹配:
$+<=>^`|~
您必须在比此 rails 应用程序更新的 ruby 版本中运行irb
,这就是它在那里匹配的原因。
另外,您应该将代码稍微更改为:
/A[[:punct:]]+z/.match('[]!"#$%&'()*+,./:;<=>?@^_`{|}~-]')
- 使用
z
,而不是Z
。略有不同:Z
还将匹配字符串末尾的新行。 - 字符串中有不必要的反斜杠,例如
'^'
- 您重复了一个
[
字符:'[]['