Если вы хотите изменить выражение, чтобы оно соответствовало или полностью пустой строке или полному URL, вам нужно будет использовать метасимволы якоря ^ и $ (которые соответствуют началу и конец строки соответственно).
^(|https?:\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?)$
Как уже отмечалось, вы можете немного упростить соответствие для протокола, поэтому я включил это и для вас.
Хотя, если вы используете это выражение из программы или скрипта, вам может быть проще использовать собственные средства проверки языков, если ввод пуст.
// in no particular language...
if input.length > 0 then
if input matches <regex> then
input is a URL
else
input is invalid
else
input is empty