I would use a bit modified @PS.'s solution:
grep -oP '^(.*/)?\K.*?(?=:|\z)'
Test for some different inputs:
(echo "INPUT=RESULT"
while read -r from
do
base=$(grep -oP '^(.*/)?\K.*?(?=:|\z)' <<<"$from")
echo "$from=${base:-UNDEFINED}"
done <<'EOF') | column -s= -t
/aaa/bb:bb/fff:xx
/fff:xx
/fff:
/fff
/:xx
/
./aaa/bb:bb/fff:xx
./fff:xx
./fff:
./fff
./:xx
./
aaa/bb:bb/fff:xx
fff:xx
fff:
fff
:xx
EOF
prints
INPUT RESULT
/aaa/bb:bb/fff:xx fff
/fff:xx fff
/fff: fff
/fff fff
/:xx UNDEFINED
/ UNDEFINED
./aaa/bb:bb/fff:xx fff
./fff:xx fff
./fff: fff
./fff fff
./:xx UNDEFINED
./ UNDEFINED
aaa/bb:bb/fff:xx fff
fff:xx fff
fff: fff
fff fff
:xx UNDEFINED