Please help me compose a working regular expression. Conditions:
- There can be a maximum of
9characters (from 1 to 9). - The first eight characters can only be uppercase letters.
- The last character can only be a digit.
Examples:
Do not match:
S3FT5FGTU7ERTYUOP9ERTGHYUKM
Correspond to:
EERTRTYUKLVBNDEFRW3
I tried using the following:
^[A-Z]{1,8}\d{0,1}$
but in this case, the FT5 example matches, although it shouldn't.
CodePudding user response:
You may use an alternation based regex:
^(?:[A-Z]{1,8}|[A-Z]{8}\d)$
RegEx Details:
^: Start(?:: Start non-capture group[A-Z]{1,8}: Match 1 to 8 uppercase letters|: OR[A-Z]{8}\d: Match 8 uppercase letters followed by a digit
): End non-capture group$: End
CodePudding user response:
You might also rule out the first 7 uppercase chars followed by a digit using a negative lookhead:
^(?![A-Z]{1,7}\d)[A-Z]{1,8}\d?$
^Start of string(?![A-Z]{1,7}\d)Negative lookahead to assert not 1-7 uppercase chars and a digit[A-Z]{1,8}Match 1-8 times an uppercase char\d?Match an optional digit$End of string
CodePudding user response:
With a regex engine that supports possessive quantifiers, you can write:
^[A-Z]{1,7} (?:[A-Z]\d?)?$
The letter in the optional group can only succeed when the quantifier in [A-Z]{1,7} reaches the maximum and when a letter remains. The letter in the group can only be the 8th character.
For the .net regex engine (that doesn't support possessive quantifiers) you can write this pattern using an atomic group:
^(?>[A-Z]{1,7})(?:[A-Z]\d?)?$
