Как вы сказали, Брайан говорит, что вы смотрите на условную конструкцию, и Java их не поддерживает. Выражение в скобках сразу после вопросительного знака может фактически быть любым утверждением нулевой ширины, таким как предвидение или просмотр назад, а не просто ссылкой на группу захвата. (Я предпочитаю называть эти обратные утверждения , чтобы избежать путаницы. обратная ссылка соответствует тому же, что и группа захвата, но обратное утверждение просто утверждает, что группа захвата соответствует что-то .)
Я узнал об условных обозначениях, когда работал в Perl несколько лет назад, но никогда не пропускал их в Java. В этом случае, например, простое чередование поможет:
(?i)<a\s+[^>]+>\s*<img\s+[^>]+>\s*</a]>|<img\s+[^>]+>
Одним из преимуществ условной версии является то, что вы можете захватить тег IMG с помощью одной группы захвата:
(?i)(<a\s+[^>]+>\s*)?(<img\s+[^>]+>)(?(1)\s*</a>)
В альтернативной версии у вас должна быть группа захвата для каждой альтернативы, но это не так важно в Java, как в Perl, со всей его встроенной магией регулярных выражений. Вот как я мог бы извлечь теги IMG в Java:
Pattern p = Pattern.compile(
"<a\\s+[^>]+>\\s*(<img\\s+[^>]+>)\\s*</a>|(<img\\s+[^>]+>)"
Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(s);
while (m.find())
{
System.out.println(m.start(1) != -1 ? m.group(1) : m.group(2));
}