А как же ^(?:8\d{9,10}|(?:10|12)\d{8,9}$
?
Edit:
Тогда не делайте этого в регулярных выражениях. Псевдокод:
function check(number):
array areaCodes = array(8, 10, 12, 981)
if !number ~= '^\d{10,11}$':
return false
foreach in areaCodes as code:
if (substring(number, 0, length(code) - 1) == code) return true
return false