2017-05-22 5 views
0

[[:punct:]]は、レールモデルテストで呼び出されたときに句読点と一致しません。次のコードを使用します。[[:punct:]]はirbとrailsのテストで異なって一致します。

test "punctuation matched by [[:punct:]]" do 
    punct_match = /\A[[:punct:]]+\Z/.match('[\]\[!"#$%&\'()*+,./:;<=>[email protected]\^_`{|}~-]') 

    puts punct_match 
    puts punct_match.class 
end 

これは、印刷できない文字とNilClassを出力します。私はIRB正しく一致し、出力

[\]\[!"#$%&'()*+,./:;<=>[email protected]\^_`{|}~-] 
=> nil 

で同じ文

punct_match = /\A[[:punct:]]+\Z/.match('[\]\[!"#$%&\'()*+,./:;<=>[email protected]\^_`{|}~-]') 

を実行した場合

しかし、私は何をしないのですか?

Rubyのバージョン=> 2.2.4、 Railsのバージョン=> 4.2.6

+0

*あなたはIRBに入力している正確に何を*? –

+0

入力:punct_match =/\A[[:punct:]]+\Z/.match('[\]\[!"#$%&\()*+,// :; <=>?@ \^#?@ \\^_' {|}〜 - "" –

+0

MRI v2.2.4を使用していますか?私はこれを試し、マッチを得なかった。再現できません。 –

答えて

2

ルビーバージョン2.4.0に若干変更/[[:punct:]]/の振る舞い。

This bugはRubyの問題で提起されたもので、Ruby 2.0+以降の正規表現エンジンであるOnigmoのthis (much older)にリンクしています。

短い答えは、これらの文字がルビーのバージョンで/[[:punct:]]/<2.4.0にマッチしていなかった、と今で一致している、次のとおりです。

これは、アプリケーションをレールよりも、あなたはある、新しいルビーバージョンでirbを実行している必要がありますそれがなぜそこに一致するのか?別のノートで


、あなたはわずかにあなたのコードを変更する必要があります

/\A[[:punct:]]+\z/.match('[]!"#$%&\'()*+,./:;<=>[email protected]^_`{|}~-]') 
  • 使用\z、ない\Zslight difference\Zがあり、文字列の末尾に改行が追加されます。
  • あなたはこのような'\^'
  • として文字列内の不要なバックスラッシュを、持っているあなたは[文字を繰り返してきた:'[\]\['
関連する問題