Представьте себе строку abc
. Если вы примените к нему регулярное выражение .*[^ab].*
, первое .*
будет соответствовать ab
, [^ab]
соответствует c
, а последнее .*
соответствует пустой строке.
Кроме того, если вы не привязываете свое регулярное выражение к началу и концу строки, может случиться (в зависимости от реализации вашего валидатора), что регулярное выражение объявляет успех, если соответствует только подстрока.
Вы хотите это:
^[^ab]*$
Соответствует любому количеству символов, кроме a
или b
. ^
привязывает регулярное выражение к началу, $
к концу строки.