Вы можете получить эти совпадения, используя группы захвата вместо использования обходных путей и сделать необязательной группу для цифр:
\b([A-Z]*[a-z]+)(\d+)?([A-Z][a-z]+)\b
\b
Граница слова, чтобы слово не входило в большее слово (
Захват группа 1 [A-Z]*[a-z]+
Совпадение 0+ символов AZ, чтобы соответствовать A
или AD
, и 1+ символов AZ, чтобы соответствовать obe
, dobe
или adobe
)
Закрыть группу (\d+)?
Опциональный захват группа 2 в соответствии 1
(
Захват группа 3 [A-Z][a-z]+
Совпадение с символом AZ и 1+ символом az, чтобы соответствовать Software
)
Закрыть группу \b
\b
Граница слова
Regex demo | Java demo
Или сопоставить 0+ цифр во второй группе (\d*)
Затем можно проверить, присутствует ли группа 2, или в В последнем случае проверьте значение группы 2.
Пример кода
String regex = "\\b([A-Z]*[a-z]+)(\\d+)?([A-Z][a-z]+)\\b";
String string = "AdobeSoftware\n"
+ "adobeSoftware\n"
+ "ADobeSoftware\n"
+ "adobe1Software";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
for (int i = 1; i <= matcher.groupCount(); i++) {
if (matcher.group(i) != null) {
System.out.println(matcher.group(i));
}
}
System.out.println("\n");
}
Выход
Adobe
Software
adobe
Software
ADobe
Software
adobe
1
Software