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

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

0

入力チェックについて

String str = hoge.readLine();
strの文字列をチェックするのが目的です。
条件:a-z,A-Z,A−Z,漢字・ひらがな・カタカナのみ

今まで、半角や、空白、特定のタグなどのチェックですませ
ていましたが、名前を保存するべきところに、†←などの記
号が含ませてしまえる事が気持ち悪くて仕方がありません。

宜しくお願いいたします。

11

回答

3876

閲覧

11件の回答

評価

0

何をお願いしたことについて「宜しく」と言ってるんだ?
そこまでのどこにも、依頼事項がないんだが。

評価

0

投稿者:補足させてください。

条件以外の文字が入力された時の判定の仕方をおしえてくだ
さい。

評価

0

質問する際は、まず自分で調べて試してみたことを書くべき
だ。
そうでなければただの丸投げになる。
ここは質問者の代わりに考え、コードを提示してくれるとこ
ろではない。

評価

0

投稿者:補足
検査する文字列を一文字ずつ、unicodeの使用したい
範囲内であるを調べるようにしてます。
この場合だと「あ」と「い」の間の「ぃ」が通過し
てしまいます。処理を増やせば対処可能ではありま
すが、適切ではないと思えるので、より良い方法が
あれば、おしえてください。


for (int count = 0; count < str.length(); 
count++) {
decimal = str.charAt(count);
if (65 <= decimal && decimal <= 90 ||
97 <= decimal && decimal <= 122    ||
11904 <= decimal && decimal <= 12245 ||
12354 <= decimal && decimal <= 12532 || 
13342 <= decimal && decimal <= 40891 || 
65313 <= decimal && decimal <= 65338 || 
65345 <= decimal && decimal <= 65370) {
}else{
error = 1;
break;
}



評価

0

例えば、

"あいうえお".indexOf(decimal)


こういう場合は正規表現を使うとループなしに一発で判定
ができて楽だ。

評価

0

投稿者:マシにはなったと思いますがどうでしょうか?
あと、条件を厳しくするなら、自分でパターンを調整す
るしかないって理解でよろしいでしょうか?

// ひらがな
public static final String HIRAGANA = 
"\\u3040-\\u3096";
// カタカナ
public static final String KATAKANA = 
"\\u30A1-\\u30F4";
// 漢字
public static final String KANJI = 
"\\u3400-\\u9FBB";

while (true) {
    str = bf.readLine();
    if (str.equals("exit")) {
        System.exit(0);
    }
    if(str.matches(toMatchRegex(HIRAGANA +KATAKANA 
+ KANJI))) {
        System.out.println("一致");
    } else {
        System.out.println("不一致");
    }
}

評価

0

toMachRegex()が何か解らんが(コードは必要十分なものを
提示すべきだ)、少なくともその正規表現だと、

あア亜

みたいな3文字しか通らなそうだが。


条件を厳しくする云々はその通り。
君が求める厳格なチェックは一般的なものではなく、従って
誰も作ってはくれない。

評価

0

投稿者:先のコードだと3種類ですね。
単純な疑問ですが「厳格なチェックは一般的なものでは
なく」ってありますが、データベースに名前を保存する
時、「ぃ」とか「゜」など、人間の名前には無効な文字
をチェックする事は厳格に部類されるのですか?
もちろん、システムによって重要度が変わるとは思いま
すが、自分が受注側だとすれば、この程度言われなくて
も弾いてくれって思ってしまいそうです。

「厳格なチェック」についての論点が回答者様と差異が
ありましたら、申し訳ありません。

評価

0

投稿者:一応コードです。
public class Test {

    // 英字
    public static final String ALPHA = "^[a-
zA-Z]+$";
    // 数字
    public static final String NUMBER = "^[0-
9]+$";
    // ひらがな
    public static final String HIRAGANA = 
"\\u3040-\\u3096";
    // カタカナ
    public static final String KATAKANA = 
"\\u30A1-\\u30F4";
    // 漢字
    public static final String KANJI = 
"\\u3400-\\u9FBB";

    // 「指定コード」とマッチングする正規表現
を返す
    public static String toMatchRegex(String 
codes) {
        return "^[" + codes + "]+$";
    }

    public static void main(String args[]) 
throws IOException {

        BufferedReader bf = new 
BufferedReader(new InputStreamReader(System.in));
        String str = new String();
        while (true) {
            str = bf.readLine();
            if (str.equals("exit")) {
                System.exit(0);
            }
            if 
(str.matches(toMatchRegex(HIRAGANA + KATAKANA + 
KANJI + ALPHA))) {
                
System.out.println("正常");
            } else {
                
System.out.println("不適切な文字");
            }
        }
    }
}

評価

0

>この程度言われなくて
>も弾いてくれって思ってしまいそうです。
思うのは勝手だが、現実にはそれで期待したものにならない
事例は枚挙に暇がなく、また後から文句を言っても通らない
(追加開発扱い)こともままある。

裁判にでもなれば、システムの指向性や要件、規模、期間、
対価、重大度などなどを勘案してどちらにどれだけ非がある
か判断される。
しかし、揉めた時のお互いのロスを考えれば、思いつく限り
要件に含めることだ。(無論、これは受発注両方に言える
が)

評価

0

投稿者:回答者様の仰る通りですね。要件定義などのプ
ロセスをすっ飛ばした考え方をしていた自分が恥ずかし
いです。

回答して頂いた方々、誠に有り難うございました。

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