jim
jim

Reputation: 3201

Regex how to match an optional character

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})/

Upvotes: 319

Views: 707147

Answers (5)

Bilal Khursheed
Bilal Khursheed

Reputation: 836

here is the regex for password which will require a minimum of 8 characters including a number and lower and upper case letter and optional sepecial charactor

/((?=.\d)(?=.[a-z])(?=.*[A-Z])(?![~@#$%^&*_-+=`|{}:;!.?"()[]]).{8,25})/

/((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?![~@#\$%\^&\*_\-\+=`|{}:;!\.\?\"()\[\]]).{8,25})/

Upvotes: 0

robinvrd
robinvrd

Reputation: 1848

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

Upvotes: 1

Tim Pietzcker
Tim Pietzcker

Reputation: 336468

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?

Upvotes: 478

Stefan
Stefan

Reputation: 43575

You have to mark the single letter as optional too:

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

or make the whole part optional

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

Upvotes: 18

codaddict
codaddict

Reputation: 455400

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.

Upvotes: 71

Related Questions