ホーム DoRuby Ruby On Rails 正規表現で改行を探す

Ruby On Rails 正規表現で改行を探す

この記事はアピリッツの技術ブログ「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

あぁそういえばそうだね。といったかんじですが、
なにげに忘れてしまいがちなので覚えておきましょう。

記事を共有

最近人気な記事