With your shown samples, could you please try following.
^(?:(?:\?(?:(?:%\d+){1,})?)|(?:(?:(?:\d+%){1,})?\?(?:(?:%\d+){1,})?)|(?:\d+%\d+))$
Online demo for above regex
Explanation: Adding detailed explanation for above.
^(?: ##Matching from starting of the value, starting a non-capturing group from here.
(?:\? ##Starting non-capturing group(one for understanding purposes) matching literal ? here.
(?:(?:%\d+){1,})? ##In a non capturing group looking for % with 1 or more occurrences of digits and matching this group match keeping it optional.
)| ##Closing one non-capturing group here, with OR condition here.
(?: ##Starting non-capturing group(two) here.
(?:(?:\d+%){1,})?\? ##Looking for digits with % one or more occurrences in a non-capturing group keeping it optional followed by ?
(?:(?:%\d+){1,})? ##Checking for % digits one or more occurrences in a non-capturing group keeping it optional followed by ?
)| ##Closing two non-capturing group here, with OR condition here.
(?:\d+%\d+) ##In a non-capturing group looking for 1 or more digits % one or more digits
)$ ##Closing 1st non-capturing group at the end of value.
?in the negative look ahead needs to be escaped... or I think. Not really clear what the question is. There is no&in the sample strings.