質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

2回答

1180閲覧

正規表現で記号の記入を制限したい

uqlover

総合スコア8

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2018/08/10 03:50

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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KojiDoi

2018/08/10 03:56

「記号」の定義をはっきりさせてください。
guest

回答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
jun68ykt

総合スコア9058

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uqlover

2018/08/10 05:04

親切にご回答いただきまして、ありがとうございます。実際に動かして確認させていただきます。
otn

2018/08/10 06:11

これは、許可するパターンじゃなくて、拒否するパターンなので、validates で使うには、これの否定が必要です。
jun68ykt

2018/08/10 06:28

> validates で使うには、これの否定が必要です。 はい。それもそうですし、そもそも「記号ではない文字」や「記号と判定すべき文字」に全角も含まれるようですので、私の回答はお役に立てるものではありませんでした。
guest

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
otn

総合スコア84557

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uqlover

2018/08/10 05:06

アドバイスも含めいただきまして、ありがとうございます。おっしゃる通りですね。 今回は、ユーザが投稿するサービスでタイトルに記号を複数入れて目立たせるケースが出てきたため、そこに制限をかける意味となります。
otn

2018/08/10 05:16

> 今回は、 なるほど。であれば、説明は不要かも。 ということは、空白は許可で、全角記号も不許可ですね。 句読点や長音をどうするかとか、難しい。 許可する方を列挙するなら、/\A[許可文字]*(?:[^許可文字]?[許可文字]*){,2}\z/ です。
uqlover

2018/08/10 05:28

申し訳ありません。 /\A[!"“#$%&()*+\-.,/:;<=>?@[\]^_`{|}~!”#$%&’()=〜|{}「」`*?><_+☆★※]*(?:[!"“#$%&()*+\-.,/:;<=>?@[\]^_`{|}~!”#$%&’()=〜|{}「」`*?><_+☆★※]?[^!"“#$%&()*+\-.,/:;<=>?@[\]^_`{|}~!”#$%&’()=〜|{}「」`*?><_+☆★※]*){,2}\z/ という形でやろうとしたのですが、例えば「%%%%」が通ったり、「どうかな??」が通らなかったりしております。全角の処理を何か勘違いしているでしょうか。
uqlover

2018/08/10 05:29

上記でコメントいただいておりますね。ありがとうございます。確認します。
otn

2018/08/10 05:46 編集

1つ目の[ の直後に「~以外」の意味の ^ を書くべきところが漏れてますね。あと範囲指定の - を使うと良いと思います。
uqlover

2018/08/10 05:57

お恥ずかしい。本当に親切にありがとうございました。記号の範囲指定は調べてみます。
uqlover

2018/08/10 10:00

なるほど、こちらも試してみます。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問