Вы можете использовать комбинацию заглядываний в сочетании с проверкой длины входной строки:
String[] inputs = new String[] {
"ab,ef,cd,ef,cd,ef", // should match
"cd,cd,ef,ab,ef,ef", // should match
"ab,cd,ef", // too short
"ab,xx,ef,cd,ef,cd,ef", // xx, is invalid
"xx,ab,cd,cd,ef,ef,ef" // xx, is invalid
};
List<String> list = Arrays.asList(inputs);
String regex = "(?=.*ab)(?=.*cd.*cd)(?=.*ef.*ef.*ef)[a-f]{2}(?:,[a-f]{2}){5}";
list.stream().forEach(x -> {
if (x.matches(regex)) {
System.out.println("MATCH: " + x);
}
else {
System.out.println("NO MATCH: " + x);
}
});
Это печатает:
MATCH: ab,ef,cd,ef,cd,ef
MATCH: cd,cd,ef,ab,ef,ef
NO MATCH: ab,cd,ef
NO MATCH: ab,xx,ef,cd,ef,cd,ef
NO MATCH: xx,ab,cd,cd,ef,ef,ef