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

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

ただいまの
回答率

89.53%

Java 項目チェック

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 4,677

yk-211

score 37

前提・実現したいこと

失礼いたします。
Javaで項目チェックをしており、下記の場合どのように作成すればいいのか
教えていただきたく、質問させていただきます。

全角チェック
半角チェック
数字チェック
数値チェック
英字チェック
カナチェック
です。

現在空欄チェックと文字列数チェックは実装しております。
出来たら下のクラスのほうにメソッドの実装をしようと思っております。
そちらのソースを添付いたしますので合わせてご確認お願いいたします。

ソースコード

Java
boolean errExistsFlg = false;
        // 必須チェック
        if (StringUtils.isBlank(id)) {
            super.setErrMsg("IDは必ず入力してください。");
            errExistsFlg = true;
        }
        if (StringUtils.isBlank(name)) {
            super.setErrMsg("名前は必ず入力してください。");
            errExistsFlg = true;
        }
        if (StringUtils.isBlank(kana)) {
            super.setErrMsg("フリガナは必ず入力してください。");
            errExistsFlg = true;
        }
        if (StringUtils.isBlank(height)) {
            super.setErrMsg("身長は必ず入力してください。");
            errExistsFlg = true;
        }
        if (StringUtils.isBlank(weight)) {
            super.setErrMsg("体重は必ず入力してください。");
            errExistsFlg = true;
        }
        if (StringUtils.isBlank(birthday)) {
            super.setErrMsg("生年月日は必ず入力してください。");
            errExistsFlg = true;
        }
        if (StringUtils.isBlank(zipCode)) {
            super.setErrMsg("郵便番号は必ず入力してください。");
            errExistsFlg = true;
        }
        if (StringUtils.isBlank(address)) {
            super.setErrMsg("住所は必ず入力してください。");
            errExistsFlg = true;
        }
        if (StringUtils.isBlank(phone)) {
            super.setErrMsg("電話番号は必ず入力してください。");
            errExistsFlg = true;
        }
        // 文字列数チェック
        if (StringUtils.chkByte(id, 7)) {
            super.setErrMsg("IDは7文字で入力してください。");
            errExistsFlg = true;
        }
        if (StringUtils.chkByte(name, 40)) {
            super.setErrMsg("名前は20文字以内で入力してください。");
            errExistsFlg = true;
        }
        if (StringUtils.chkByte(kana, 40)) {
            super.setErrMsg("フリガナは20文字以内で入力してください。");
            errExistsFlg = true;
        }
        if (StringUtils.chkByte(height, 5)) {
            super.setErrMsg("身長は5文字以内で入力してください。");
            errExistsFlg = true;
        }
        if (StringUtils.chkByte(weight, 5)) {
            super.setErrMsg("体重は5文字以内で入力してください。");
            errExistsFlg = true;
        }
        if (StringUtils.chkByte(birthday, 10)) {
            super.setErrMsg("生年月日は10文字以内で入力してください。");
            errExistsFlg = true;
        }
        if (StringUtils.chkByte(zipCode, 7)) {
            super.setErrMsg("郵便番号は7文字で入力してください。");
            errExistsFlg = true;
        }
        if (StringUtils.chkByte(address, 120)) {
            super.setErrMsg("住所は60文字以内で入力してください。");
            errExistsFlg = true;
        }
        if (StringUtils.chkByte(phone, 12)) {
            super.setErrMsg("電話番号は12文字以内で入力してください。");
            errExistsFlg = true;
        }
        if (errExistsFlg) {
            // 入力チェックでエラーの場合は処理終了
            result.setUrl(requestPageUrl);
            result.setNormalEndFlg(false);
            // 処理モードをセットする。
            super.setSessionAttribute("processType", "insert");
            return result;
        }


public class StringUtils {

    /**
     * 引数の文字列がブランクかどうか判定します。(nullはブランク扱い)
     *
     * @param terget
     *            対象文字列
     * @return 判定結果(true:ブランク,false:NOTブランク)
     */
    public static boolean isBlank(String terget) {
        if (terget == null) {
            return true;
        }
        System.out.println("空白チェック対象文字:" + terget.toString());
        if (terget.length() == 0) {
            return true;

        }
        return false;
    }

    /**
     * 引数の文字列がブランクかどうか判定します。(nullはブランク扱い)
     *
     * @param terget
     *            対象文字列
     * @param len
     *            最大桁数
     * @return 判定結果(true:ブランク,false:NOTブランク)
     */
    public static boolean chkByte(String terget, int len) {
        System.out.println("バイト数チェック対象文字:" + terget);

        if (terget == null) {
            return false;
        }
        if (terget.getBytes().length > len) {
            return true;
        }

        return false;
    }

    /**
    * 引数の文字列がNOTブランクかどうか判定します。(nullはブランク扱い)
     *
     * @param terget
     *            対象文字列
     * @return 判定結果(true:NOTブランク,false:ブランク)
     */
    public static boolean isNotBlank(String terget) {
        return !isBlank(terget);
    }
}


補足情報

id 7桁 半角英数字
name 20桁以下 全角
kana 20桁以下 全角カナ
birthday 10桁以下 日付
height 5桁以下 半数値
weight 5桁以下 半数値
zipCode 7桁 半数字
address 60桁以内
phone 12桁以内 半角
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

「正規表現」を使うのが一番わかりやすいと思います.
Java正規表現の使い方
Javaで入力チェックに使える正規表現まとめ

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/06/08 13:39

    ありがとうございます!
    こういったものがあるのを知りませんでした・・・

    こちらを使用してみます。

    キャンセル

  • 2015/06/08 13:58

    実際に使用しようと使ってみたのですが、うまく使えていません。
    たとえばidが半角英数字7桁のときはtrue 違うならfalseとしたいときは
    どうすればいいでしょうか。

    キャンセル

checkベストアンサー

0

こんにちは。

正規表現を使うと、柔軟に対応できると思います。
あくまで実装の一例なのですが、まず、StringUtils クラスに以下の
メソッドを追加します。

    /**
     * 正規表現で入力値をチェック
     *
     * @param regex 正規表現
     * @param s チェック対象の文字列
     * @param allowEmpty チェック対象はnullまたは空文字であることが許されるかのフラグ
     * @return s が regexにマッチすればtrue、マッチしなければfalse
     */
    public static boolean checkMatch(String regex, String s, boolean allowEmpty)
    {
        // s がnullまたは空のとき、allowEmptyの値を返す。
        if ( s == null || s.length() == 0)
            return allowEmpty;

        // 正規表現のパターンオブジェクトを作成
        Pattern ptn = Pattern.compile(regex);

        // マッチするかどうかの判定値を返す。
        return ptn.matcher(s).find();
    }

このようにcheckMatchメソッドを作成すると、たとえば

id 7桁 半角英数字

ということなので、idの値が入ってくる変数を 

String idStr;

とすると、このidStrに何らかの値が入った後で、checkMatchメソッドに
以下のような正規表現を与えることで判定できます。

if ( StringUtils.checkMatch("^[0-9a-zA-Z]{7}$", idStr, false) ) {
  // ・・・ idStrがidとして適正な場合
} else {
 // ・・・適正ではない場合
}

上記の例では、id は必須入力であるとして、checkMatch の第3引数の
allowEmpty
には false を与えています。つまりidStrがnullだったり空文字列だった
ときには、checkMatch メソッドはfalseを返します。

このように、それぞれの項目について適正な値(の文字列)になっているかの
判定に、基本的には正規表現を使うという方針でいくことにすれば、
あとは他の入力項目についても、マッチする正規表現を考えればよいこと
になります。

その際に、たとえば郵便番号にマッチする正規表現とか、電話番号にマッチする
正規表現など、よく使うものはGoogleで「郵便番号 正規表現」あたりで
検索すると、他の方が考えたものを見つけることができますし、個別に
「この項目についての正規表現がうまく書けない」
というのがあればまた、別途の質問か追記でご質問頂ければと思います。

以上参考になれば幸いです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/06/08 17:06

    実際に入力制限があるものをすべて先ほどの書き方で当てはめたところ、エラーメッセージが表示されるようになりました!
    大変ありがとうございます。

    最後にひとつだけお時間があれば質問させてください。

    現在SQLとDB接続をして顧客の情報管理の練習をしているのですが、
    削除ボックスにチェックが入ったらその顧客の情報を論理削除するという
    ものなのですが、削除の仕方が分からず困っています。
    実際に出来ていないところが、初期値0のdeleteFlagをチェックが入ったら
    1にする。
    1になったらそのIDを論理削除するという2つです。

    文章だけでは分かりにくいということであれば、
    新しく質問させていただきます。
    もしお時間がありましたらよろしくお願いいたします。

    キャンセル

  • 2015/06/08 17:15

    こんにちは。

    > 実際に入力制限があるものをすべて先ほどの書き方で当てはめたところ、
    > エラーメッセージが表示されるようになりました!

    とのことでよかったです!

    それで、新しい質問に関してですが、新しい質問として
    投稿されたほうが色々な得意分野のある回答者さんが
    見ることができ、より良い回答を得られると思いますので、

    > 新しく質問

    するほうがよいと思います。

    ただ、

    > 削除の仕方が分からず

    とおっしゃっているところが、「どのように分からない」のか
    詳しく書いたほうがよいと思います。

    分からないのは、

    ・論理削除するときのSQLの書き方が分からないのか

    それとも

    ・そもそも論理削除ということ自体の理解が曖昧だと思っているのか

    といったあたりが伝わるように詳しく書かれると、
    yk-211さんの問題解決にすぐにつながるような
    回答を頂けるものと思います。

    以上よろしくお願い致します。

    キャンセル

  • 2015/06/08 17:22

    何度も何度も大変ありがとうございます!

    データの削除に関しましては新しく質問を
    させていただこうかと思います。

    論理削除の場合のSQLの書き方が分かっておりませんので、
    後ほど質問させていただきます。

    本当にありがとうございました!

    キャンセル

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

  • ただいまの回答率 89.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る