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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

7063閲覧

Java 項目チェック

yk-211

総合スコア34

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2015/06/08 03:47

###前提・実現したいこと
失礼いたします。
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桁以内 半角

気になる質問をクリップする

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

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

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

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

guest

回答2

0

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

投稿2015/06/08 04:32

swordone

総合スコア20649

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

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

yk-211

2015/06/08 04:39

ありがとうございます! こういったものがあるのを知りませんでした・・・ こちらを使用してみます。
yk-211

2015/06/08 04:58

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

0

ベストアンサー

こんにちは。

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

lang

1 /** 2 * 正規表現で入力値をチェック 3 * 4 * @param regex 正規表現 5 * @param s チェック対象の文字列 6 * @param allowEmpty チェック対象はnullまたは空文字であることが許されるかのフラグ 7 * @return s が regexにマッチすればtrue、マッチしなければfalse 8 */ 9 public static boolean checkMatch(String regex, String s, boolean allowEmpty) 10 { 11 // s がnullまたは空のとき、allowEmptyの値を返す。 12 if ( s == null || s.length() == 0) 13 return allowEmpty; 14 15 // 正規表現のパターンオブジェクトを作成 16 Pattern ptn = Pattern.compile(regex); 17 18 // マッチするかどうかの判定値を返す。 19 return ptn.matcher(s).find(); 20 }

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

id 7桁 半角英数字

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

String idStr;

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

lang

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

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

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

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

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

投稿2015/06/08 05:06

編集2015/06/08 05:11
jun68ykt

総合スコア9058

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

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

yk-211

2015/06/08 05:34

大変ありがとうございます。 とても詳しく記述してあり、参考にさせていただきます。 実際にメソッドの追加からidの判定まで行ってみましたが、 私の入力のミスなのか出来ませんでした。 もう1度やってみます!
jun68ykt

2015/06/08 05:42

こんにちは。 いま開発されているプログラム本体に組み込む前に、 以下のような小さいテストクラスを作成して、idStrの値をいろいろ変えてみて、 カン所をつかんでから、本体のプログラムに組み込むとよいかもしれません。 ============================ import java.util.regex.Pattern; public class TestIdCheck { 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(); } public static void main(String[] args) { String idStr = "1234ABC"; boolean result = checkMatch("^[0-9a-zA-Z]{7}$", idStr, false); System.out.println("idStr=[" + idStr + "], result=[" + result + "]"); } } ==================== 上記を実行すると idStr=[1234ABC], result=[true] と表示されるはずです。
yk-211

2015/06/08 06:02

サンプルコードまで提示していただき本当にありがとうございます! おっしゃっていただいたことがようやく理解できましたので、 使用してみたいと思います。 本当にありがとうございました!
jun68ykt

2015/06/08 06:56

どういたしまして。うまくいきそうで、よかったです。
yk-211

2015/06/08 07:08

申し訳ありません。 追加でお聞きしたいのですが、 //入力制限チェック if (StringUtils.checkMatch("^[0-9a-zA-Z]$", id, false)) { super.setErrMsg("IDは半角英数字で入力してください。"); errExistsFlg = true; } if (StringUtils.checkMatch("^[^ -~。-゚]$", name, false)) { super.setErrMsg("名前は全角で入力してください。"); errExistsFlg = true; } と先ほどのメソッドをStringUtils クラスに追加して実行し、 IDに全角、名前に半角を入れエラーメッセージを表示させようと思いましたが 普通に登録できてしまいました。 この部分だけでは原因がよく分からないかもしれませんが、ここの書き方が 間違っているのでしょうか?
jun68ykt

2015/06/08 07:18

まずidにもnameにもいえることですが、 私が例示したcheckMatchメソッドは、 入力値として正しいときに trueを返すので、 if ( !StringUtils.checkMatch("^[0-9a-zA-Z]$", id, false)) { super.setErrMsg("IDは半角英数字で入力してください。"); errExistsFlg = true; } のように、「エラーである場合には」のif の中で使うには StringUtils の前に否定演算子 ! が必要です。 挙げられているコードには、この ! が抜けています。 それと、「名前は全角文字だけで20文字以下」を チェックするための正規表現として ^[^ -~。-゚]$ はちょっと違うかもです。
jun68ykt

2015/06/08 07:22

さきほど、 > ^[^ -~。-゚]$ > はちょっと違うかもです。 とコメントしましたが、[]の先頭で ^ を使うのは良いアイディアだと思います。
yk-211

2015/06/08 07:26

返信ありがとうございます。 理解が出来ておらず申し訳ありませんでした。 おっしゃられたように!を入れてみたところ出来ました。 名前は全角文字で、ということで先ほどの正規表現を入れてみましたが、 間違っていたようですみません。
jun68ykt

2015/06/08 07:32

いえいえ。 それで、「全角文字だけで、1文字以上20文字以下」の正規表現は String nameRegex = "^[^\\x01-\\x7E]{1,20}$"; でいけると思います。 ※ちなみに自分で考えたわけではなく、ここ http://fujiringo.sakura.ne.jp/hayabusa/blog/code/2011/07/post-1.html から頂いてきました。 これをcheckMatchメソッドの第1引数に渡せばうまくいくと思いますが、 ダメそうなら、またコメント頂ければと思います。
yk-211

2015/06/08 08:06

実際に入力制限があるものをすべて先ほどの書き方で当てはめたところ、エラーメッセージが表示されるようになりました! 大変ありがとうございます。 最後にひとつだけお時間があれば質問させてください。 現在SQLとDB接続をして顧客の情報管理の練習をしているのですが、 削除ボックスにチェックが入ったらその顧客の情報を論理削除するという ものなのですが、削除の仕方が分からず困っています。 実際に出来ていないところが、初期値0のdeleteFlagをチェックが入ったら 1にする。 1になったらそのIDを論理削除するという2つです。 文章だけでは分かりにくいということであれば、 新しく質問させていただきます。 もしお時間がありましたらよろしくお願いいたします。
jun68ykt

2015/06/08 08:15

こんにちは。 > 実際に入力制限があるものをすべて先ほどの書き方で当てはめたところ、 > エラーメッセージが表示されるようになりました! とのことでよかったです! それで、新しい質問に関してですが、新しい質問として 投稿されたほうが色々な得意分野のある回答者さんが 見ることができ、より良い回答を得られると思いますので、 > 新しく質問 するほうがよいと思います。 ただ、 > 削除の仕方が分からず とおっしゃっているところが、「どのように分からない」のか 詳しく書いたほうがよいと思います。 分からないのは、 ・論理削除するときのSQLの書き方が分からないのか それとも ・そもそも論理削除ということ自体の理解が曖昧だと思っているのか といったあたりが伝わるように詳しく書かれると、 yk-211さんの問題解決にすぐにつながるような 回答を頂けるものと思います。 以上よろしくお願い致します。
yk-211

2015/06/08 08:22

何度も何度も大変ありがとうございます! データの削除に関しましては新しく質問を させていただこうかと思います。 論理削除の場合のSQLの書き方が分かっておりませんので、 後ほど質問させていただきます。 本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問