- 締切済み
正規表現について
どう質問したらいいか分かりませんが頑張ってみます。 コントローラのほうに params[:money] で得た値に正規表現で、入力必須、半角数字でないとエラーが出るように設定したいのですが正規表現の書き方がよく分かりません。 ぜひ教えてください。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
RubricksはRailsを利用してるらしいね。本当は#2で書くつもりだったけどRailsを使ったことはないし、環境もないのでRubricksの動作を確認することはできない。でも質問はそれ以前の話題、言い替えるとRubyの基本的な使い方なのでこれまで回答してきた。 今回もRubyの範囲で答えられるので引き続いて回答する。ズバリと答のみ書いてもいいがデバッグのやり方がわかってないようなのでそれも書く。もはや正規表現の話題ではないけど。 補足に挙げられたスクリプトはそのままでは動かない。そこで必要な部分だけを実行できる形で書き直した。 params = Hash[:money, '123456789'] # 本来はブラウザからの入力 p params[:money].to_i # debug(1) check1 = false if params[:money].to_i <= 0 p check1 # debug(2) p check1 == false #debug(3) if check1 == false puts 'Error' else puts 'OK' end # ここから先は本題と関係ないので省略 トラブったときはスクリプトを単純化して動かしてみる。これ大事。それから変数の値を目に見えるようにして確認するのも大事。コメントで'debug(x)'と書いてあるのがその部分。そういう機能のあるIDEを使ってるならそれで確認してもよし。 params[:money]の値を変えながら何度か実行してみて。するとある値のときに期待した動作をしないのがわかる。一例では'123a456'のときがそうだ。本来はエラーにしたいがOKの表示が出る。 なぜそうなるのかはdebugの出力を見るとわかる。String.to_iは文字列の整数と解釈できる部分までを変換する。だからdebug(1)の値は123になってるわけだ。123は0より大きいからcheck1にfalseは入らない。なにが入ってるかというとnil(debug(2))だ。nilとfalseを比較するとfalse(debug(3))なので結果としてOKが表示されるという流れだ。 このようにデバッグは変数の値を目で確認しながらやる。やみくもに修正してもだめだ。params[:money]の値を変えて確認してみよう。メソッドや構文で不明な点はちゃんとリファレンスを読むこと。これ基本。 さてお説教も飽きたと思うのでここで回答。具体的には次のようにスクリプトを修正する。 params = Hash[:money, '123456789'] # 本来はブラウザからの入力 check1 = true # 追加行 check1 = false unless params[:money] =~ /^[0-9]+$/ # 追加行 p params[:money].to_i # debug(1) (以下同じ) 職場の後輩なら「デバッグしてみろ」でしばらく放っとくのだが、仕事で急いでるかもしれないので今回も大サービス。でも上で書いたことは大事だから覚えておいて。
> irb を使わない方法も教えて頂けませんか? 困ったね。正規表現を教えてほしいということだから答えたんだけど、そうなると正規表現とは別の問題だ。どうもRubyの基本からわかってないように思える。 params[:money]が文字列だとすると params[:money] =~ /^[0-9]+$/ で文字列が正規表現とマッチするかわかる。マッチしない場合はnilが返るので if params[:money] =~ /^[0-9]+$/ 正常時の処理 else エラー時の処理 end で処理を振り分ける。 乗りかかった舟なので大サービスで回答した。できれば自分で書いたサンプルを載せて、どこがうまくいかないかを質問してほしい。今回のは丸投げに近い。出し惜しみしてるわけじゃなくて、#1くらいの回答でも一応の検証をしてるとそれなりの時間がかかるんだ。好きで回答してるから時間をかけること自体は嫌じゃないけど、それが無駄になるのはとてもやるせない。それは理解して。 ちなみに'コントローラ'と書いてあるけどこれはRailsのことかな?まずはRubyの基本をきちんと勉強すべきだと思うよ。リファレンス読んだことありますか?リファレンスの制御構造とStringクラスをよく読むこと。 参考URL:Ruby リファレンスマニュアル
補足
すばやい対応していただいたのに、 ご連絡遅くなりまして申し訳ございません。 訳が分からなくなり、丸投げした形になりまして申し訳ございませんでした。質問に答えて頂くだけでも普通はコストがかかるのに、、、 私の考えが浅はかでした。 私は、現在 Rubricks のコンポーネントを作成しています。 下記のコードをコントローラに書きます。 def check check1 = false \ if params[:money].to_i <= 0 if check1 == false @money_check = false @errmsg << '入力確認してください。' end end 私がはじめ上記のコードで書いてみたのですがエラーが出ずにそのまま次にいってしまいました。 本当なら、ブラウザ上から半角数字、入力していないとエラーがでるように設定したかったのです。 情報不足ですみませんでした。
$ irb irb(main):001:0> '0123456789' =~ /^[0-9]+$/ <- これだけがマッチ => 0 irb(main):002:0> '0123456789' =~ /^[0-9]+$/ => nil irb(main):003:0> '' =~ /^[0-9]+$/ => nil irb(main):004:0> 'o123456789' =~ /^[0-9]+$/ => nil irb(main):005:0> 'あいうえおかきくけこ' =~ /^[0-9]+$/ => nil nilが返ってきたらエラー処理をするということで。
お礼
irb というコマンド自体masa_peeさんのおかげで始めて知りました。 まだまだ初心者なので知らないことだらけです。 素早い対応どうもありがとうございました。
補足
irb を使わない方法も教えて頂けませんか?
お礼
誰にも聞けずに全然進まなかったので、本当にタメになりました。 もう一度、リファラレスを呼んで勉強していきたいと思います。 私の為に多くの時間をさいて頂きまして本当にありがとうございます。