Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

フォームの入力チェックについて

既存のプログラムで,問い合わせの仕組みで電話番号の入力チェックを行っている部分があります。
現在、数字のみしか受け付けていない仕様となっているのですが、それを数字、+、−、(、)、を許可するような仕様に変更したいと思っています。

既存のプログラムは以下のようになっています。
---------------------------------------------------------------------
for(i = 0; i < this.TELEPHONE.length(); i++) {
    c = this.TELEPHONE.charAt(i);
    if(c < '0' || c > '9'){
           errors.add("TelError",new ActionError("TelError.required"));
           break;
    }
}
---------------------------------------------------------------------

上記を以下のように変更すればOKでしょうか?
---------------------------------------------------------------------
for(i = 0; i < this.TELEPHONE.length(); i++) {
    c = this.TELEPHONE.charAt(i);
    if( (c < '0' || c > '9') && (c != '-') && (c != '+') && (c != '(') && (c != ')')){
           errors.add("TelError",new ActionError("TelError.required"));
           break;
    }
}
---------------------------------------------------------------------

もし何かマズイ点などありましたら教えてください。
初心者で今回初めて既存プログラムの修正を自ら行う事になってしまったため、ちょっとビビってます。


よろしくお願いいたします。

17

回答

6407

閲覧

17件の回答

評価

0

そういう時はJUnitとか使ってテストするんだよ。
あと、正規表現を勉強すると幸せになれるかも。

まぁちゃんとやろうとすると、
http://blog.livedoor.jp/nipotan/archives/50634795.html
こんな感じに死ねますけど、もとのプログラムを見る限りそこまでは求めてないからいいんじゃないかな。
[0-9\-+()]+
みたいな正規表現になるのかな。かなり適当なんで、これを使うとしてもちゃんとテストすること。
責任は持ちません。

評価

0

もうちょっとちゃんとした正規表現
((\(\d{2,4}\))|(\d{2,4}))-?((\(\d{3,4}\))|(\d{3,4}))-?((\(\d{4}\))|(\d{4}))

評価

0

これをJavaに組み込むとこんな感じ

// フィールドに用意しておく
private static final Pattern TEL_PATTERN = Pattern.compile("((\\(\\d{2,4}\\))|(\\d{2,4}))-?((\\(\\d{3,4}\\))|(\\d{3,4}))-?((\\(\\d{4}\\))|(\\d{4}))");

// 処理部分
if (!TEL_PATTERN.matcher(TELEPHONE).matches()) {
    errors.add("TelError",new ActionError("TelError.required"));
}

評価

0

回答ありがとうございます。

海外からの入力(海外の電話番号、国コードなども含む)もあるため、パターン化をすることが難しい状況です。

よって、単純に、「数字、+、−、(、)」のみを許可するといった仕様で良いです。


正規表現というものが良く理解できていないので、、
その辺を勉強しないといけないかもしれません。

評価

0

ならこれでいいと思うよ。

// フィールドに用意しておく
private static final Pattern TEL_PATTERN = Pattern.compile("[\\d+\\-()]+");

// 処理部分
if (!TEL_PATTERN.matcher(TELEPHONE).matches()) {
    errors.add("TelError",new ActionError("TelError.required"));
}

ここで、TEL_PATTERNはローカル変数にしちゃ意味無いからね。動くけど。

評価

0

aa

評価

0

> もうちょっとちゃんとした正規表現
> ((\(\d{2,4}\))|(\d{2,4}))-?((\(\d{3,4}\))|(\d{3,4}))-?((\(\d{4}\))|(\d{4}))

質問者は「数字、+、−、(、)、を許可するような仕様に変更したい」と書いてますし、仕様を超えるオーバースペックな正規表現を使う必要はないと思いますよ。ちなみに日本には市外局番が5桁の地域もあるので、上記の正規表現はまずいです。

評価

0

悪いことだとは言わないが…日付を見てから回答しよう。

評価

0

別に質問者の問題解決のためだけに書き込んでいるわけではないので。私の他にもこのスレッドを初めて見る人がそれなりの数いるでしょう?

入力規則が不明瞭なまま細かすぎる正規表現を設定すると、本来許容されなければならない入力が弾かれてしまうことになりますよ、たとえば市外局番は思いの外長いんですよ、という指摘は今回このスレッドを初めて見た人にとっても意味があるんじゃないかな。

むしろ「日付を見てから回答しよう」なんて風潮だと、時期を逸した質問はずっと回答が付かないことにもなりかねないし、あまり好きじゃないです。悪いことだとは言いませんけども。

評価

0

過去のものだと分かったうえで、「質問」にそれなりのコメントをつけてたなら、良かったんだよ。
以前の「解答者」に向けてコメントをつけてたから、見てないかもしれないよ、ということ。

評価

0

すみません… 意味が良く分かりません。

別に特定の回答者1人に向けて書いたコメントではないのですが、そのように見えてしまいますか。「過去のものだと分かったうえで」という条件が必要な理由も私には理解できません。

日付に気付かずにコメントを書くことがそんなにまずいことなのかなあ?『質問や回答がデータベースに保管・蓄積され、のちのち多くの人の問題解決に役立つように』なればいいと思います。

評価

0

自分にはですが、2010-06-15 12:16のコメントは
2007-10-17 17:09のコメントが、質問者の提示している仕様に対しては
最適な回答ではないのでは、という「特定の回答者に向けてのもの」に見えました。

過去の質問に対して云々は、個人の自由でいいと思います。

評価

0

>> 2010-06-16 11:24

過去の質問または回答(2007-10-17 17:09 )

上記に対して(2010-06-15 12:16) それ間違えてる

上記に対して(2010-06-15 12:36) 日付みよう

という感じにあたりは受け取ってるはずですよ。

評価

0

>そんなにまずいことなのかなあ?
いや…言ってないって。

スタンスを変えさせる権利も義務も持ってないし、これ以上はとくに言うことがないなあ…。


ついでなんで、今回のパターンについてもうひとつ。
それぞれの桁数が連携してないことも書いておくかな。
今でも12桁にマッチするし、単純に市外局番を{2,5}にすると13桁もマッチするようになる。
もっとも、市外局番でその後を制御するのは書きたくないな…。

#そういえば市外局番7桁って何だっけ?と思ってぐぐったら、70年代までの手動式だそうな。

評価

0

> いや…言ってないって。

そうなんですか? 良くないと言われていると私は感じています。

> 過去のものだと分かったうえで、「質問」にそれなりの
> コメントをつけてたなら、良かったんだよ。

過去のトピックだと認識している && 質問者向けのコメント →良かった、ということですよね。この条件を満たさない場合は良くないという意図になりませんか?

私は「過去のトピックだと認識している」も「質問者向けのコメント」どちらも満たしていないので、どう考えても「良かった」とは言えない状態ですよね。

> スタンスを変えさせる権利も義務も持ってないし、
> これ以上はとくに言うことがないなあ…。

まあ、私はスタンスを変えるつもりはないんですけどね。$さんがどういった理由で「日付を見てから回答しよう」と考えているのか知りたいという気持ちはあります。当事者の役に立たない可能性が高いから無駄にインターネットリソースを使うなといったところでしょうか。

評価

0

その「良かった」があったから、その逆で「まずい」と…それなら、そこは言葉の選択を誤った、失礼。
「気にならないだろう」くらいに言い直させて欲しい。

>無駄にインターネットリソースを使うな
それは管理人の判断することかなと。
私もあくまで、使わせてもらってる立場だから。
(それを言い出したら、このやりとり自体本題と関係ないのだから、無駄だしね…)


繰り返しになるけど。
「回答に対してのコメント」と認識したから「当事者の役に立たない可能性が高い」ことを認識してもらいたかった。
それ以上のことは考えてないし、まして「追加情報を提供すること」がおかしいなんてことは絶対に言わない。

評価

0

OK、納得しました。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。