Como os intervalos usados aqui são de tamanho fixo, você pode simplesmente escrever o intervalo inteiro [0-9]{3} = > %código%. E em vez de [0-9][0-9][0-9] , (| |-|.) - embora esteja confuso: você está permitindo qualquer caractere ( ( |-|.)? ), além de espaço e . ? Então, pode ser apenas - , já que space e .? são correspondidos por - . Se você está combinando o período literal . , então você deve usar . (o primeiro [- .]? é para evitar a interpretação como um intervalo de caracteres). Então:
^\(?0[1-9]{2}\)?(| |-|.)[1-9][0-9]{3}( |-|.)[0-9]{4}$
Torna-se:
^\(?0[1-9][1-9]\)?[- .]?[1-9][0-9][0-9][0-9][- .][0-9][0-9][0-9][0-9]$