その他
    ホーム 技術発信 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

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