Javaが小文字/大文字、特殊文字、数字を文字列でチェックする

Javaは文字列の小文字/大文字、特殊文字、および数字をチェックします

1. 概要

このクイックチュートリアルでは、check if a String is containing at least one of each of the following: uppercase letter, lowercase letter, digit or special character in Javaを実行する方法を説明します。

2. 正規表現を使用する

チェックを実行する方法の1つは、正規表現を使用することです。 正規表現に慣れるために、this articleをチェックしてください。

まず、必要な文字グループごとに正規表現を定義しましょう。 Since regular expressions are fixed, there is no need to evaluate them at each run, so we’ll compile them before we compare against them

private static final Pattern[] inputRegexes = new Pattern[4];

static {
    inputRegexes[0] = Pattern.compile(".*[A-Z].*");
    inputRegexes[1] = Pattern.compile(".*[a-z].*");
    inputRegexes[2] = Pattern.compile(".*\\d.*");
    inputRegexes[3] = Pattern.compile(".*[`[email protected]#$%^&*()\\-_=+\\\\|\\[{\\]};:'\",<.>/?].*");
}

また、Stringが条件に一致するかどうかをテストするために使用する簡単なメソッドを作成する必要があります。

private static boolean isMatchingRegex(String input) {
    boolean inputMatches = true;
    for (Pattern inputRegex : inputRegexes) {
        if (!inputRegex.matcher(input).matches()) {
            inputMatches = false;
        }
    }
    return inputMatches;
}

2.1. 単一の正規表現

前の例は非常に読みやすく、必要に応じていくつかのパターンのみを簡単に使用できます。 ただし、すべての条件を満たしているだけの場合、単一の正規表現を使用する方がはるかに効率的です。

そうすれば、複数の式をすべて初期化してコンパイルするための静的ブロックは必要ありません。 また、それらすべてを繰り返し処理して、一致するものと一致しないものを見つける必要はありません。

正規表現を宣言するだけです。

String regex = "^(?=.*?\\p{Lu})(?=.*?\\p{Ll})(?=.*?\\d)" +
    "(?=.*?[`[email protected]#$%^&*()\\-_=+\\\\|\\[{\\]};:'\",<.>/?]).*$";

そしてコンパイルして比較します:

@Test
public void givenSingleRegex_whenMatchingCorrectString_thenMatches() {
    String validInput = "Ab3;";
    assertTrue(Pattern.compile(regex).matcher(validInput).matches());
}

正規表現に関して注意すべき点がいくつかあります。

First, we’ve used positive lookahead (?=X) for every group of characters。 つまり、一致させるために、文字列の先頭(^でマーク)の後にXが見つかると予想されますが、Xの末尾には移動したくないということです。むしろ、私たちは行の先頭に留まりたいと思っています。

もう1つの注意点は、今回は文字グループに[A-Z]または[a-z]を使用せず、代わりに\p{Lu}および\p{Ll}を使用したことです。 これらは、英語だけでなく、あらゆる言語のあらゆる種類の文字(この場合、それぞれ大文字と小文字)に一致します。

3. コアJavaの使用

正規表現を使用したくない場合に、同じチェックを実行する方法を見てみましょう。 Character およびStringクラスとそのメソッドを利用して、必要なすべての文字がStringに存在するかどうかを確認します。

private static boolean checkString(String input) {
    String specialChars = "~`[email protected]#$%^&*()-_=+\\|[{]};:'\",<.>/?";
    char currentCharacter;
    boolean numberPresent = false;
    boolean upperCasePresent = false;
    boolean lowerCasePresent = false;
    boolean specialCharacterPresent = false;

    for (int i = 0; i < input.length(); i++) {
        currentCharacter = input.charAt(i);
        if (Character.isDigit(currentCharacter)) {
            numberPresent = true;
        } else if (Character.isUpperCase(currentCharacter)) {
            upperCasePresent = true;
        } else if (Character.isLowerCase(currentCharacter)) {
            lowerCasePresent = true;
        } else if (specialChars.contains(String.valueOf(currentCharacter))) {
            specialCharacterPresent = true;
        }
    }

    return
      numberPresent && upperCasePresent && lowerCasePresent && specialCharacterPresent;
}

ここでいくつかの点に注意する必要があります。 基本的な考え方は、Stringを繰り返し処理し、その文字が必要なタイプであるかどうかを確認することです。 Characterクラスを使用すると、特定の文字が数字であるか、大文字であるか、小文字であるかを簡単に確認できます。

残念ながら、私たちが特別なキャラクターの1人を扱っているかどうかを教えてくれる同様の方法はありません。 したがって、別のアプローチをとる必要があるということです。

必要なすべての特殊文字を含むStringを作成し、特定の文字が含まれているかどうかを確認しました。

4. 結論

この簡単な記事では、Stringに必要な文字が含まれているかどうかを確認する方法を示しました。 In the first scenario, we used regular expressions while in the second we took advantage of core Java classes

いつものように、完全なソースコードはover on GitHubにあります。