^\+36(?:70|[23][01]|\d)\d{7}$
Ennél rövidebben nem tudom.
A dolog trükkje, hogy az alternation definíció szerint az első találatig megy, nincs backtrack. Így a zárójeles kifejezés a 20, 21, 30, 31, 70 körzetek esetén a körzetszámot, egyébként a körzetszám első számjegyét adja vissza (ami Budapest esetében maga a körzetszám).
A dologgal egyébként elvi problémám van: mi értelme ilyen szinten ellenőrizni? Ha már ezt csinálod, arra is tesztelni kéne, hogy az adott körzetszám létezik-e, illetve értelmes-s. (Ha pl. ügyfél telefonszámát kéred be, az 51 biztos nem lesz jó, pedig valós körzetszám.)