regex matching conditional strings

Viewed 129

For example, if I have the following strings:

99%89 (should match)
99%? (should match)
?%99 (should match)
?%? (should not match)
?%99%99 (should match)
99%99%99%? (should match)

essentially the first or second element can be a ? or a number, but both elements cannot be ?. I tried thinking of something like:

[0-9]*|[?](?!\?)[%][0-9]*|[?]

But this does not yield the correct answer, any help would be appreciated

2 Answers

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.

Not sure if I am reading the question right, but as you tried using a negative lookahead you could assert that the string does not only contains % and/or ?

^(?![%?]+$)[\d?%]+$

Regex demo

Or without a lookahead:

^[%?]*\d[%?\d]*$

Regex demo

Related