Просто перефразируя и подтверждая правила соответствия, которые вы сказали, чтобы мое решение придерживалось его,
- три позиции из четырех должны занимать либо
A
, либо B
- Зарезервирована только одна позиция для
C
или D
Если это правильно, вы можете использовать это регулярное выражение для сопоставления строк, которые вы хотите.
^(?=[AB]*[CD][AB]*$).{4}$
Объяснение вышеприведенного регулярного выражения:
^
- Начало строки (?=[AB]*[CD][AB]*$)
- Положительный взгляд вперед, чтобы обеспечить либо C
, либо D
появляется в строке только один раз, поэтому остальные три позиции заняты A
s и B
s .{4}$
- Захват четырех букв A
до D
с использованием точки, поскольку они уже провереныбыть A
до D
положительным прогнозом.
Regex Demo
Вот это регулярный график для лучшей визуализации

Редактировать: Подробное объяснение (?=[AB]*[CD][AB]*$)
A положительный взгляд вперед записывается как (?=some regex)
и, в отличие от обычного сопоставления и потребления регулярных выражений, обходной путь (положительный / отрицательный взгляд вперед / взгляд назад) просто соответствует символам и не потребляетОни означают, что как только выражение просмотра завершено, маркер регулярного выражения сбрасывается туда, где он был до того, как началось сопоставление.В этом регулярном выражении у нас есть [AB]*[CD][AB]*$
как выражение внутри него, где [AB]*
означает, что оно будет соответствовать любому символу в наборе (A
или B
) ноль или более раз, за которым следует [CD]
, что означает, что оно должно соответствоватьровно один символ (так как здесь нет квантификатора) из набора символов, который является либо C
, либо D
, а еще раз [AB]*
соответствует любому символу A
или B
ноль или более раз и, наконец, обеспечивает конец строкидостигается, поскольку оно имеет $
.
Таким образом, логическое значение этого выражения состоит в том, что будет точно один случай: C
или D
, тогда как он может быть окружен A
s или B
с любой стороны, если необходимо, чтобы сформировать четыре алфавита, соответствующих всем комбинациям из четырех букв, имеющих только одно вхождение C
или D
.
Кроме того, включено предложение revo где [A-D]
можно изменить только на .
Большое спасибо Revo.