最初の文字の後の各部分に「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}
。