この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
ども、 rick No.17です。
今回は正規表現で以外とはまりがちというか忘れがちなことについて書きます。Railsのvalidateの一つである
validates_format_ofを使用している時にちょっとはまりました。
前提
こんな記事があるとします
hoge
hogehoge
しかし、開発者は改行を付けてほしくない。
なので改行をした記事は、投稿できない様にしたいわけです。
問題
$vi app/models/hoge.rb
class Hoge < ActiveRecord::Base
validates_format_of :body, :with => /^[^\r\n]*$/, :message => “は、改行禁止です”
end
記事のカラムはbodyカラムで、改行禁止の正規表現を書いたつもりでした。。が、、、、
全然問題なく改行しても登録されてしまう。。。
なぜか???
解説
答えは^と$でした。
^は行頭、$は行末であり文の先頭から最後ではない。
つまり改行前の「hoge」と改行後の「hogehoge」しか見てくれない為、
改行の\nはマッチしない。
hoge\n
hogehoge
上記の下線部分しかみてくれないわけですね。
解答
では、どうすればいいか?
\Aと\zを使用すればいいのです。
\A\zは改行を無視して文頭、文末を見てくれるので一文の中から改行の有無を探してくれます。
$vi app/models/hoge.rb
class Hoge < ActiveRecord::Base
validates_format_of :body, :with => /\A[^\r\n]*\z/, :message => “は、改行禁止です”
end
あぁそういえばそうだね。といったかんじですが、
なにげに忘れてしまいがちなので覚えておきましょう。