Если вы работаете с одним словом за раз, попробуйте следующее:
boolean isMatch = s.matches(
"(?i)^(?:J()|U()|G(?!.*G)()|[GLERS]()|\\w){4,}+$\\1\\2\\3\\4");
Если вы ищете совпадения в более длинной строке:
Pattern p = Pattern.compile(
"(?i)\\b(?:J()|U()|G(?!.*G)()|[GLERS]()|\\w){4,}+\\b\\1\\2\\3\\4");
Matcher m = p.matcher(s);
while (m.find()) {
String foundString = m.group();
}
Каждый разодна из первых четырех альтернатив - J()
, U()
, G()
или [GLERS]()
- соответствует чему-либо, пустая группа, следующая за ней, ничего не «захватывает» (т. е. пустая строка).Когда достигается конец строки, каждая из обратных ссылок - \1
, \2
и т. Д. - пытается сопоставить то же самое, что и соответствующая ей группа: снова ничего.
Очевидно, что это всегда будет успешным;Вы всегда можете соответствовать, отмечая.Хитрость в том, что обратная ссылка не будет даже пытаться соответствовать, если соответствующая группа не участвовала в матче.То есть, если в целевой строке нет j
, ()
в альтернативе J()
никогда не включается.Когда механизм регулярных выражений обрабатывает обратную ссылку \1
позже, он немедленно сообщает об ошибке, потому что знает, что группа не участвовала в матче.
Таким образом, пустые группы действуют как флажки, иОбратные ссылки убедитесь, что все флажки были отмечены.Хотя есть одна морщина.Обе альтернативы G()
и [GLERS]()
могут соответствовать g
;как убедиться, что они оба участвуют в матче, когда они вам нужны?Первое регулярное выражение, которое я попробовал,
"(?i)^(?:J()|U()|G()|[GLERS]()|\\w){4,}+$\\1\\2\\3\\4"
... не соответствовало слову "jugg", потому что альтернатива G()
потребляла оба g
;[GLERS]()
никогда не было возможности принять участие.Поэтому я добавил отрицательный прогноз - (?!.*G)
- и теперь он соответствует только last g
.Если бы у меня было три варианта, которые могли бы соответствовать g
, мне пришлось бы добавить (?!.*G.*G)
к первому и (?!.*G)
ко второму.Но в действительности я, вероятно, перешел бы на другой подход (возможно, не включающий регулярные выражения) задолго до того, как я достиг этой точки.;)