Потому что ищет в строке любой фрагмент, содержащий от 4 до 15 цифр (в фрагмент из 15 цифр 4 цифры так же входят, поэтому верхняя граница здесь значения не имеет)
Укажите символы начала и конца строки, чтобы проверять соответствие всей строки, а не любого фрагмента в ней: /^[0-9]{4,15}$/
|