Вы можете использовать отрицательный прогноз с обратной ссылкой:
^(?!.*([A-Z]{2}).*\1).*
, если, как и во всех примерах в вопросе, известно, что строка содержит только разделенные запятыми пары прописных письма. Я ослаблю это предположение позже в своем ответе.
Демонстрация
Регулярное выражение выполняет следующие операции:
^ # match beginning of line
(?! # begin negative lookahead
.* # match 0+ characters (1+ OK)
([A-Z]{2}) # match 2 uppercase letters in capture group 1
.* # match 0+ characters (1+ OK)
\1 # match the contents of capture group 1
) # end negative lookahead
.* # match 0+ characters (the entire string)
Предположим, теперь одна или несколько заглавных букв могут появляться между каждой парой запятых или до первой запятой или после последней запятой, но только строки из двух букв не могут быть повторены. Кроме того, я предполагаю, что регулярное выражение должно подтвердить, что регулярное выражение имеет желаемую форму. Тогда можно использовать следующее регулярное выражение:
^(?=[A-Z]+(?:,[A-Z]+)*$)(?!.*(?:^|,)([A-Z]{2}),(?:.*,)?\1(?:,|$)).*
Демо
Регулярное выражение выполняет следующие операции:
^ # match beginning of line
(?= # begin pos lookahead
[A-Z]+ # match 1+ uc letters
(?:,[A-Z]+) # match ',' then by 1+ uc letters in a non-cap grp
* # execute the non-cap grp 0+ times
$ # match the end of the line
) # end pos lookahead
(?! # begin neg lookahead
.* # match 0+ chars
(?:^|,) # match beginning of line or ','
([A-Z]{2}) # match 2 uc letters in cap grp 1
, # match ','
(?:.*,) # match 0+ chars, then ',' in non-cap group
? # optionally match non-cap grp
\1 # match the contents of cap grp 1
(?:,|$) # match ',' or end of line
) # end neg lookahead
.* # match 0+ chars (entire string)
Если нет Нужно проверить, что строка содержит только строки, разделенные запятыми, из одной или нескольких заглавных букв, которые можно удалить в начале.