Собстевнно речь именно про это. Код это проходной. Но он длинный, в нём явно есть регулярные группы, которые стоило бы компактифицировать (см. тесты с assert). Но я не смог найти как. Пытался копаться в Balancing, но не понял, как это сюда применить.
"^\\+\\d{12}"

 + "|^\\+\\(\\d{3}\\)\\d{9}"
 + "|^\\+\\d{1}\\(\\d{3}\\)\\d{8}"
 + "|^\\+\\d{2}\\(\\d{3}\\)\\d{7}"
 + "|^\\+\\d{3}\\(\\d{3}\\)\\d{6}"
 + "|^\\+\\d{4}\\(\\d{3}\\)\\d{5}"
 + "|^\\+\\d{5}\\(\\d{3}\\)\\d{4}"
 + "|^\\+\\d{6}\\(\\d{3}\\)\\d{3}"
 + "|^\\+\\d{7}\\(\\d{3}\\)\\d{2}"
 + "|^\\+\\d{8}\\(\\d{3}\\)\\d{1}"

 + "|\\d{10}"

 + "^\\(\\d{3}\\)\\d{7}"
 + "|^\\d{1}\\(\\d{3}\\)\\d{6}"
 + "|^\\d{2}\\(\\d{3}\\)\\d{5}"
 + "|^\\d{3}\\(\\d{3}\\)\\d{4}"
 + "|^\\d{4}\\(\\d{3}\\)\\d{3}"
 + "|^\\d{5}\\(\\d{3}\\)\\d{2}"
 + "|^\\d{6}\\(\\d{3}\\)\\d{1}"
assert checkTelNumber("+380501234567") ;

assert checkTelNumber("+(050)001234567");
assert checkTelNumber("+3(050)01234567");
assert checkTelNumber("+38(050)1234567");
assert checkTelNumber("+380(050)234567");
assert checkTelNumber("+3800(050)34567");
assert checkTelNumber("+38000(050)4567");
assert checkTelNumber("+380000(050)567");
assert checkTelNumber("+3800000(050)67");
assert checkTelNumber("+38000000(050)7");

assert checkTelNumber("0501234567") ;

assert checkTelNumber("(050)1234567");
assert checkTelNumber("0(501)234567");
assert checkTelNumber("00(501)34567");
assert checkTelNumber("000(501)4567");
assert checkTelNumber("0000(501)567");
assert checkTelNumber("00000(501)67");
assert checkTelNumber("000000(501)7");

assert !checkTelNumber("+38)050(1234567");
assert !checkTelNumber("+38(050)123-45-67");
assert !checkTelNumber("050ххх4567");
assert !checkTelNumber("050123456");
assert !checkTelNumber("(0)501234567");

assert !checkTelNumber(null);