Предполагая, что вы хотите запретить только строки, которые полностью соответствуют регулярному выражению (то есть, mmblaэто нормально, но mmнет), это то, что вы хотите:
^(?!(?:m{2}|t)$).*$
(?!(?:m{2}|t)$)отрицательный взгляд вперед ; он говорит: «начиная с текущей позиции, следующие несколько символов не являются mmили t, за которыми следует конец строки». Начальный якорь ( ^) в начале гарантирует, что просмотр вперед применяется в начале строки. Если это удастся, то .*продолжит и потребляет строку.
К вашему сведению, если вы используете matches()метод Java , вам действительно не нужны the ^и final $, но они не причиняют никакого вреда. Однако $внутренний просмотр вперед необходим.
{1}совершенно бесполезно. (Если вы думаете, что это дает некоторую ценность, почему бы вам не написать((m{1}a{1}){1}|(t){1}){1}?)