After enabling the docker setting "Preserve user defined networks", any network that has a name starting with a number will still be removed when docker is restarted.
I did some digging in /etc/rc.d/rc.docker and noticed this check in the stop_network function:
[[ $DOCKER_USER_NETWORKS != preserve || $STOCK =~ ${NETWORK%%[0-9]*} ]] && docker network rm $NETWORK 1>/dev/null 2>&1
The part after the or is what is causing the issue. It compares $STOCK to the network name after stripping the first number and any following characters from it. So if a network is called "5.x", then ${NETWORK%%[0-9]*} will simply return an empty string. This will cause the regex to match to $STOCK and return true (for some reason I don't understand). The network will then be removed.
It would be good if either a warning could be printed somewhere to inform that starting with a number is not allowed, or if the regex could be rewritten to allow it.