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

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

ただいまの
回答率

91.00%

  • Java

    12178questions

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

文字列の連続文字検索

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 205

ramensan

score 1

前提・実現したいこと

javaで認証のプログラミングを行っております。
たとえば、ユーザー名の有効性を確認する際に、
既存のユーザー名の連続した文字の3文字に一致していないかどうかをチェックするロジックで
苦難しております。
お手数ですが、ご助力お願いいたします。

<例>
既存ユーザー名:ABCDEFG
・新規ユーザー1:ABC123 →不可 ※既存ユーザー名の連続した3文字ABCを含む
・新規ユーザー2:12DEF3 →不可 ※既存ユーザー名の連続した3文字DEFを含む
・新規ユーザー3:AB3DE5 →可  ※既存ユーザー名の連続した3文字を含まない

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

ここにご自身が実行したソースコードを書いてください

試したこと

・javaのstringクラスのメソッド(contains,indexof)
・正規表現(/(.)\1{2,}/)
※比較元の文字が3文字の固定値であれば、可能ですが、比較元の文字列内の連続した文字という
比較だとできませんでした。

補足情報(言語/FW/ツール等のバージョンなど)

java7 eclipse

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+2

こんにちは。

以下、考え方とコードの一例です。

"ABCDEFG" に含まれる長さ 3 の部分文字列は、以下の5個あります。

"ABC"
"BCD"
"CDE"
"DEF"
"EFG"

チェック対象の文字列が、これらの 5個をどれも含まなければ判定 OK 、
1つでも含んでいれば判定 NG を返すメソッドを書けばよいです。

この考え方を実装したコードが以下です。

public class Tera109831 {

    static final int CHECK_LENGTH = 3;

    public static void main(String[] args) {
        String checkedUser = "ABCDEFG";
        String[] newUsers = new String[]{"ABC123", "12DEF3", "AB3DE5"};

        for (String user: newUsers) {
            String result = check(user, checkedUser, CHECK_LENGTH);
            System.out.printf(
                "newUser: %s, checkedUser: %s: result:%s\n",
                user, checkedUser, (result != null ? "NG[" + result + "]": "OK"));
        }
    }

    /**
     * 文字列 b に含まれる長さ len の部分文字列のどれかをaが含むかどうかを判定
     *
     * 返り値:
     *  含まない場合: null
     *  含む場合: aが含むbの部分文字列
     */
    private static String check(String a, String b, int len) {
        for (int i = 0; i < b.length()- len; ++i) {
            String s = b.substring(i, i + len);
            if (a.indexOf(s) >= 0)
                return s;
        }
        return null;
    }
}

上記をコンパイル、実行すると以下が出力されます。

newUser: ABC123, checkedUser: ABCDEFG: result:NG[ABC]
newUser: 12DEF3, checkedUser: ABCDEFG: result:NG[DEF]
newUser: AB3DE5, checkedUser: ABCDEFG: result:OK

ただし、上記のコードの checkメソッドは aまたは b がnull
場合や、len が b の長さ以上だった場合、あるいは0以下の場合にも
エラーにならず適切な結果を返すようにはなっていないので、完全なものに
するには、これらに対応するコードを追加する必要があります。

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


追記

最近の Java の関数型の記法を使えば、もっと短いコードで書けるかもしれませんが、
この回答の主目的は、質問の解法として

"ABCDEFG" に含まれる長さ 3 の部分文字列を、先頭の "ABC" から順に作っていき、
それらのいずれかを、チェック対象の文字列が含むかどうか?を判定すればよい。

という考え方を提示することです。


追記2

私の回答の終わりに

完全なものにするには、これらに対応するコードを追加する必要があります。

と書いています。
これは、言い換えると、回答に挙げたcheckメソッドは、
この回答のコメントにある、

2018/01/20 11:15
 
aやbがnullだった場合はNullPointerExceptionが、
lenがbの長さを超えていたらIndexOutOfBoundsExceptionがちゃんと発生すると思います。

といった実行時例外の発生について考慮したものになっていない、という意味です。

(ただし、これらの例外が起きないようにパラメータをチェックするコードを
書くことは、ご質問の本題ではないので、回答のコードには含めませんでした。)

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/01/20 11:41 編集

    aやbがnullだった場合はb.length()やa.indexOf(s)でNullPointerExceptionが、
    lenがbの長さを超えていたらb.substring(i, i + len)でIndexOutOfBoundsExceptionがちゃんと発生すると思います。

    キャンセル

  • 2018/01/20 13:05 編集

    @swordone
    追記2 を追加して、回答をより親切なものにすることができました。ありがとうございます。

    キャンセル

  • 2018/01/20 14:12

    大変、参考になりました。
    ロジックだけでなく、発生し得る例外等についても親切にケアしていただき、
    感謝の言葉しかありません。

    皆様、大変ありがとうございました!

    キャンセル

  • 2018/01/20 14:13

    解決されたようで、よかったです!

    キャンセル

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

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

関連した質問

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

  • Java

    12178questions

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