Чтобы не совпадать с пустыми строками, вы можете сопоставить повторяющиеся наборы по 1-3 раза с B, по крайней мере, с любым символом, за исключением того, что B между или соответствует строке, заканчивающейся 1-3 раза по a B
^(?:[^B]*(?:B{1,3}[^B]+)+B{0,3}|[^B]*B{1,3})$
^
Начало строки (?:
Группа без захвата [^B]*
Совпадение 0+ раз с любым символом, кроме B (?:
Группа без захвата B{1,3}[^B]+
Повторите 1+ раз 1-3 B и 1+ раз любой символ, кроме B
)+
Закройте группу и повторите 1+ раз B{0,3}
Совпадение 0-3 B в конце |
Или [^B]*B{1,3}
Совпадение 0+ раз с любым символом, кроме B и затем 1-3 раза a B
)
Закрыть группу $
Конец строки
Regex demo
Если допускается пустая строка, шаблон можно сократить до
^(?:[^B]*(?:B{1,3}[^B]+)*B{0,3})$
Regex demo
Примечание , класс отрицанных символов [^B]
соответствует любому символу, кроме B, и может также соответствовать новой строке. Чтобы запретить сопоставление символов новой строки, используйте [^B\r\n]
или [^B\s]
для исключения пробельных символов.