ruby
1VALID_TITLE_REGEX_NON_WORD = /記号は2つまでですよ/i 2validates :title, format: { with: VALID_TITLE_REGEX_NON_WORD, message: "に利用できる記号は2つまでです" }, if: ->(u) { u.title.present? }
このようにvalidationをかけたいと思っています。
記号を2つまでに制限する正規表現についてご教授いただけますと嬉しいです。色々試したものの、結果うまく行かず。
よろしくお願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
こんにちは。
以下は、「記号ではない文字」を正規表現の \w
(アルファベット、数字、アンダスコア( _ )のどれかの1文字)と解釈しての回答になります。
記号を2つまでに制限する
ということを、逆から考えると、
-
\w
ではない文字、すなわち\W
が3個以上含まれていたら NG -
上記でなければ OK
となるので、以下のように書けます。
ruby
1bad_pattern = /\W\w*\W\w*\W/ 2 3# 以下はテストです。 4 5%w[ 6 ABC-def 7 ABC=def/456 8 ABC=def/456+111 9 hoge_789**1 10 -0123-- 11].each do |str| 12 puts "#{str}: #{bad_pattern === str ? 'NG' : 'OK'}" 13end
上記を実行すると、以下のように表示されます。
ABC-def: OK
ABC=def/456: OK
ABC=def/456+111: NG
hoge_789**1: OK
-0123--: NG
投稿2018/08/10 04:24
編集2018/08/10 04:40総合スコア9058
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
/\A[^#]*[#]?[^#]*[#]?[^#]*\z/
で、#
の部分に対象にしたい記号を並べる。
あと、そういう意味不明の制約を設けるときは、制約を設ける理由も表示した方が良いかと思います。
追記:
/\A[^#]*(?:[#]?[^#]*){,2}\z/
でいいか。
追記2:
何度も同じ事は書かなくて良いです。
Ruby
1KIGO='!-/:-@[-`{-~' ←半角記号だけならこれだけ 2 3/\A[^#{KIGO}]*(?:[#{KIGO}]?[^#{KIGO}]*){,2}\z/
追記3:
[:word:]
が使えそうです。OKMOJIじゃないのは2つまで。
Ruby
1OKMOJI='[:word:]、。・' ←普通の文字と若干の記号はいくつあってもOK 2/\A[#{OKMOJI}]*(?:[^#{OKMOJI}]?[#{OKMOJI}]*){,2}\z/
投稿2018/08/10 04:03
編集2018/08/10 07:59総合スコア84557
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/10 05:06
2018/08/10 05:16
2018/08/10 05:28
2018/08/10 05:29
2018/08/10 05:46 編集
2018/08/10 05:57
2018/08/10 10:00
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。