Dom Vinyard
Dom Vinyard

Reputation: 2088

Validate incomplete Regex

Let's say we have a Regex, in my case it's one I found to match UK car registration plates:

^([A-Z]{3}\s?(\d{3}|\d{2}|d{1})\s?[A-Z])|([A-Z]\s?(\d{3}|\d{2}|\d{1})\s?[A-Z]{3})|(([A-HK-PRSVWY][A-HJ-PR-Y])\s?([0][2-9]|[1-9][0-9])\s?[A-HJ-PR-Z]{3})

A typical UK car registration is

HG53CAY

This is matched correctly by the regex, but what i'd like to do is find a way to match any prefix substring of this, so the following would all be valid:

H, HG, HG5, HG53, HG53C, HG53CA, HG53CAY

Is there a suggested way to achieve this?

Upvotes: 1

Views: 110

Answers (1)

Peter Herdenborg
Peter Herdenborg

Reputation: 5962

Firstly I'd rewrite your regexp to look like this:

^([A-Z]{3}\s?(\d{1,3})\s?[A-Z])|([A-Z]\s?(\d{1,3})\s?[A-Z]{3})|(([A-HK-PRSVWY][A-HJ-PR-Y])\s?([0][2-9]|[1-9][0-9])\s?[A-HJ-PR-Z]{3})

as the \d{3}|\d{2}|d{1} parts make no sense and should be written \d{1,3}.

Rewriting the regexp like

^([A-Z]{0,3}\s?(\d{0,3})\s?[A-Z]?)|([A-Z]\s?(\d{0,3})\s?[A-Z]{0,3})|(([A-HK-PRSVWY][A-HJ-PR-Y]?)\s?([0]?[2-9]?|[1-9]?[0-9]?)\s?[A-HJ-PR-Z]{0,3})

should have the desired effect of allowing matching of only the beginning of a registration, but unfortunately it's no longer guaranteed that the full registration will be a valid one, as I had to make most characters optional.

You could possibly try something like this

^(([A-Z]{3})|[A-Z]{1,2}$)\s?((\d{1,3})|$))...

to make it require either that each part is complete, or that it is incomplete but followed by "end of string", represented by the $ in the regexp.

Upvotes: 1

Related Questions