Ruby 的字符类标点符号, i.e. [:punct:]
, \p{Punct}
, or \p{P}
似乎根据我使用的 Ruby 版本匹配不同的字符。
这是一个小例子:(很抱歉弄乱了 SO 的语法荧光笔)
# punct.rb
chars = <<-EOD.split
! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ ] ^ _ ` { | } ~
EOD
matched, not_matched = chars.partition { |c| c =~ /[[:punct:]]/ }
puts " matched: #{matched.join}"
puts "not matched: #{not_matched.join}"
使用 Ruby 1.9.3 和 Ruby 2.4.0 我得到:
matched: !"#$%&'()*+,-./:;<=>?@[]^_`{|}~
not matched:
但是中间的各种 Ruby 版本(2.0.x、2.1.x、2.2.x、2.3.x)给了我:
matched: !"#%&'()*,-./:;?@[]_{}
not matched: $+<=>^`|~
为什么会发生这种情况以及正确的行为是什么?更重要的是:如何在 Ruby 版本之间获得一致的结果?
尝试更改我的区域设置无济于事(按照建议为什么 Ruby /[[:punct:]]/ 会丢失一些标点符号?).