I have this regular expression "([0-9TA])?(\\d{4})?([A-Z]{3})?" and the string "52021CCC".
String testNumber = "52021CCC";
String[] parts = null;
String regex = "([0-9TA])?(\\d{4})?([A-Z]{3})?";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(testNumber);
if (matcher.matches() || matcher.find()) {
parts = new String[3];
parts[0] = matcher.group(1);
parts[1] = matcher.group(2);
parts[2] = matcher.group(3);
System.out.println(parts[0]);
System.out.println(parts[1]);
System.out.println(parts[2]);
}
I expected to print : 5, 2021, CCC
but it prints null, null, null.
When I change the input string to 5T2021CCC, it prints: T, 2021, CCC
My question is, since the first group is a single digit or the charaters T or A shouldnt the 52021CCC be matched and printed correctly?
I cannot understand where is the problem here.
The problem is in the expression in the if:
if (matcher.matches() || matcher.find()) {
Since matcher.matches() returns true and this is a logical or, this expression short-circuits and the matcher.find() is never executed. This, all calls to group() will return null.
A simple fix is to replace the or with an and:
if (matcher.matches() && matcher.find()) {
In this case it might actually be enough to only call find and remove the matches check.