Regex how to match an optional character

440,808

Solution 1

Use

[A-Z]?

to make the letter optional. {1} is redundant. (Of course you could also write [A-Z]{0,1} which would mean the same, but that's what the ? is there for.)

You could improve your regex to

^([0-9]{5})+\s+([A-Z]?)\s+([A-Z])([0-9]{3})([0-9]{3})([A-Z]{3})([A-Z]{3})\s+([A-Z])[0-9]{3}([0-9]{4})([0-9]{2})([0-9]{2})

And, since in most regex dialects, \d is the same as [0-9]:

^(\d{5})+\s+([A-Z]?)\s+([A-Z])(\d{3})(\d{3})([A-Z]{3})([A-Z]{3})\s+([A-Z])\d{3}(\d{4})(\d{2})(\d{2})

But: do you really need 11 separate capturing groups? And if so, why don't you capture the fourth-to-last group of digits?

Solution 2

You can make the single letter optional by adding a ? after it as:

([A-Z]{1}?)

The quantifier {1} is redundant so you can drop it.

Solution 3

You have to mark the single letter as optional too:

([A-Z]{1})? +.*? +

or make the whole part optional

(([A-Z]{1}) +.*? +)?

Solution 4

You also could use simpler regex designed for your case like (.*)\/(([^\?\n\r])*) where $2 match what you want.

Share:
440,808

Related videos on Youtube

jim
Author by

jim

Updated on October 19, 2021

Comments

  • jim
    jim over 2 years

    I have a regex that I thought was working correctly until now. I need to match on an optional character. It may be there or it may not.

    Here are two strings. The top string is matched while the lower is not. The absence of a single letter in the lower string is what is making it fail.

    I'd like to get the single letter after the starting 5 digits if it's there and if not, continue getting the rest of the string. This letter can be A-Z.

    If I remove ([A-Z]{1}) +.*? + from the regex, it will match everything I need except the letter but it's kind of important.

    20000      K               Q511195DREWBT            E00078748521
    30000                      K601220PLOPOH            Z00054878524
    

    Here is the regex I'm using.

    /^([0-9]{5})+.*? ([A-Z]{1}) +.*? +([A-Z]{1})([0-9]{3})([0-9]{3})([A-Z]{3})([A-Z]{3}) +([A-Z])[0-9]{3}([0-9]{4})([0-9]{2})([0-9]{2})/
    
  • jim
    jim over 13 years
    Thanks codeaddict. Does the question mark take the place of the ` +.*? +`?
  • jim
    jim over 13 years
    Tim, I honestly am not sure as I didn't write this regex. I'm still pretty new to regex. If you see a better way of writing this, I'm open to suggestions.
  • jim
    jim over 13 years
    Stefan, I'd like to make the letter totally optional. I tried both of these but it still matches nothing. I'm sure that I've got it wrong. Could you modify your example to include it into the string?
  • jim
    jim over 13 years
    Tim, your example works for both strings whether I have a letter in that position or not. Thanks.
  • Zunderscore
    Zunderscore over 6 years
    When using grep regex you will get an error if you drop the {1} (grep: lookbehind assertion is not fixed length). So that's a case for leaving it in.