I’m trying to construct a regex to screen valid part and/or serial numbers in combination, with ranges.
A valid part number is a two alpha, three digit pattern or /[A-z]{2}\d{3}/
i.e. aa123 or ZZ443 etc...
A valid serial number is a five digit pattern, or /\d{5}/
13245 or 31234 and so on.
That part isn’t the problem. I want combinations and ranges to be valid as well:
12345, ab123,ab234-ab245, 12346 - 12349 – the ultimate goal. Ranges and/or series of part and/or serial numbers in any combination. Note that spaces are optional when specifying a range or after a comma in a series. Note that a range of part numbers has the same two letter combination on both sides of the range (i.e. ab123 – ab239)
I have been wrestling with this expression for two days now, and haven’t come up with anything better than this:
/^(?:[A-z]{2}\d{3}[, ]*)|(?:\d{5}[, ]*)|(?:([A-z]{2})\d{3} ?- ?\4\d{3}[, ]*)|(?:\d{5} ?- ?\d{5}[, ]*)$/
…
My Regex-Fu is weak.
First,
[A-z]is wrong. In addition to letters, it will match a square bracket, backslash, caret, underscore or backtick–all the characters that lie between the uppercase letters and lowercase letters in the ASCII character set. You should use either[A-Za-z], or[A-Z]with the case-insensitive option.To match either a single serial number or a range of serial numbers, do this:
…and for the part numbers:
In your regex you used
\4, but that was wrong. It may have been the fourth group that matched the letters in first part number, but it was only the first capturing group, so you should have used\1.Putting that together to match a whole series, you have
The comma has to be optional, but that means the regex could incorrectly match a sequence like
1234512345or12345ab123. Unlikely as that is to happen, I added the word boundary (\b) to cover it. There has to be at least one non-word character between two serial/part numbers/ranges, and(?:,\s*)?means that can only be a comma and optional whitespace. Your[, ]*would allow any number of spaces and/or commas, or nothing at all.