[[:p unct:]] 在 IRB 和 Rails 测试中匹配不同



[[: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 还将匹配字符串末尾的新行。
  • 字符串中有不必要的反斜杠,例如'^'
  • 您重复了一个[字符:'[]['

最新更新