1

正規表現を使用して、入力時にユーザー入力を検証しようとしています。

私のパターンは次"(\\w{3})(\\d{7})(\\w{3})". のとおりです。有効な入力は"XYZ0001112CCC".

ユーザータイプとして検証したい。私"A", "AB", "ABC", "ABC12", "ABC123", ..., "ABC1234567XY"も失敗してはいけないということです。しかし、"A1", "AB2", "ABCD123", ..., "ABC1234567XY1"失敗しなければなりません。入力がルールを破らない限り、「今のところ有効」と仮定したい。これは正規表現で可能ですか?

4

4 に答える 4

1

最初の文字の後の各部分に「1 回またはまったく」量指定子を組み合わせて使用​​し、後読みを使用して入力の前の部分を検証します。

例えば:

//                           |first letters (1 to 3)
//                                        | if 3 letters precede...
//                                                         | digits (1 to 7)
//                                                                   | if 7 digits precede...
//                                                                               | 3 letters
Pattern p = Pattern.compile("[a-zA-Z]{1,3}((?<=[a-zA-Z]{3})\\d{1,7})?((?<=\\d{7})[a-zA-Z]{3})?");
String[] inputs = {"XYZ0001112CCC", "A", "AB", "ABC", "ABC12", "ABC123", "A1", "AB2", "ABCD123","ABC1234567XY1"};
Matcher m;
for (String input: inputs) {
    m = p.matcher(input);
    System.out.println("Input: " + input + " --> Matches? " + m.matches());
}

出力:

Input: XYZ0001112CCC --> Matches? true
Input: A --> Matches? true
Input: AB --> Matches? true
Input: ABC --> Matches? true
Input: ABC12 --> Matches? true
Input: ABC123 --> Matches? true
Input: A1 --> Matches? false
Input: AB2 --> Matches? false
Input: ABCD123 --> Matches? false
Input: ABC1234567XY1 --> Matches? false

ノート

数字も検証するため、\\w式を文字クラスに変更しました。代替手段は次のとおりです。[a-zA-Z]\\w[a-zA-Z]

  • \\p{Alpha}
  • [a-z]Pattern.CASE_INSENSITIVE旗を立てて

最後の注意事項

MyPatternは、最後の文字を 3 文字のグループとして受け取ります。1 文字または 2 文字も受け入れる場合は、最後の量指定子式{3}を で変更するだけで済みます{1,3}

于 2013-10-25T12:34:00.593 に答える
1

パターンをよりシンプルなものに変更できます([a-zA-Z]+)(\d+)([a-zA-Z]+)

次に、各グループに含まれる文字数を確認できます。

Pattern p = Pattern.compile("([a-zA-Z]+)(\d+)([a-zA-Z]+)");
Matcher matcher = p.matcher("ABC1234567XYZ");
if (matcher.find()) {
    String firstLetters = matcher.group(1);
    String digits = matcher.group(2);
    String lastLetters = matcher.group(3);

    //any checks here
}
于 2013-10-25T12:30:54.417 に答える
0

検証を 2 つの別個の正規表現に分割することをお勧めします。1 つは現在までの有効性検証用で、もう 1 つは最終チェック用です。

それでも、たとえばABC1が今のところ有効であることを検証するのは簡単ではありません。X0Cが誤って有効と見なされる(\\w{0,3})(\\d{0,7})(\\w{0,3})ため、次のようなパターンは適切ではありません。したがって、正規表現だけでこの問題を解決しようとするのではなく、コード化されたロジックを使用することをお勧めします。

(後読みまたはif-then-else 条件のいずれかを使用して、すべての検証ロジックを 1 つの正規表現に絞り込むことは可能ですが、そうしないことをお勧めします。これは判読できず、保守もできません。)

于 2013-10-25T12:29:29.147 に答える