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

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

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

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

Q&A

解決済

1回答

1066閲覧

文字列の連続文字検索

ramensan

総合スコア7

Java

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

0グッド

0クリップ

投稿2018/01/20 00:38

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

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

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

エラーメッセージ

###該当のソースコード

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

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

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは。

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

"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または bnull
場合や、lenb の長さ以上だった場合、あるいは0以下の場合にも
エラーにならず適切な結果を返すようにはなっていないので、完全なものに
するには、これらに対応するコードを追加する必要があります。

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


追記

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

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

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


追記2

私の回答の終わりに

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

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

2018/01/20 11:15

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

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

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

投稿2018/01/20 01:40

編集2018/01/20 05:29
jun68ykt

総合スコア9058

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

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

swordone

2018/01/20 02:41 編集

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

2018/01/20 04:05 編集

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

2018/01/20 05:12

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

2018/01/20 05:13

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問