4

文字列検証の国際化をサポートするには?

私のプログラムでは、入力文字列に少なくとも 1 つの英字と 1 つの数字が含まれ、長さが 2 ~ 10 であることを保証する正規表現がありました。

Pattern p = Pattern.compile("^(?=.\d)(?=.[A-Za-z])[A-Za-z0-9]{2,10}$");

新しい要件に従って、国際化をサポートする必要があります。どうすればそれができますか?

メッセージの国際化をサポートするために、リソース バンドル、翻訳されたハード コード テキストを使用したプロパティ ファイルを使用しました。しかし、文字列を検証できるかどうかはわかりません。

4

2 に答える 2

4

必要なのはUnicodeです!

Unicode コード プロパティ

Pattern p = Pattern.compile("^(?=.*\p{Nd})(?=.*\p{L})[\p{L}\p{Nd}]{2,10}$");

\p{L}および\p{Nd}は Unicode プロパティです。

\p{L}任意の言語の任意の種類の文字です

\p{Nd}表意文字スクリプトを除くすべてのスクリプトの 0 から 9 までの数字

Unicode プロパティの詳細については、regular-expressions.infoを参照してください。

Pattern.UNICODE_CHARACTER_CLASS

Pattern.UNICODE_CHARACTER_CLASS事前定義された文字クラスの Unicode バージョンを有効にする新しいプロパティもあります。詳細とリンクについては、こちらの回答を参照してください。

あなたはこのようなことをすることができます

Pattern p = Pattern.compile("^(?=.*\\d)(?=.*[A-Za-z])\\w{2,10}$", Pattern.UNICODE_CHARACTER_CLASS);

任意の言語のすべての文字と\wすべての数字に一致します (もちろん、 のような文字を組み合わせた単語もあります_)。

正規表現のエラー

また、正規表現を少し変更しました。元の先読み ( (?=.\d)(?=.[A-Za-z])) は、文字と数字である 2 番目の文字をチェックします。すべての点で何が失敗しているのか、量指定子を使用した私のバージョンでは、それらが文字列のどこかにあるかどうかをチェックします。

于 2012-05-04T06:36:25.413 に答える
0

この時点で、どの文字 (存在する場合) がアルファ文字 (スペースなど) としてカウントされないかを定義する方がよい場合があります。次に、「少なくとも1つの数字と1つの数字以外の文字」にします。しかし、要件に関してあなたが抱えている問題は、それが少しばかげていることに起因すると思います。

これはパスワード用ですか?2 文字のパスワードは完全に安全ではありません。10 文字を超えるパスワードを使用したい人もいるでしょう。これより長いパスワードを許可しない理由は実際にあるのでしょうか?

http://xkcd.com/936/は、実際に強力なパスワードを構成する要素の概要を示しています。番号を要求することは、現代の攻撃者に対してはあまり役に立ちませんが、ユーザーの生活を困難にします。長いパスワードを要求することをお勧めします。

于 2012-05-04T06:10:47.280 に答える