I have a requirement where I need to match string which satisfies all of the below requirements -
- String must be of length 12
- String can have only following characters - Alphabets, Digits and Spaces
- Spaces if any must be at the end of the string. Spaces in between are not allowed.
I have tried with below regex -
"^[0-9a-zA-Z\s]{12}$"
Above regex is satisfying requirement #1 and #2 but not able to satisfy #3. Please help me to achieve the requirements. Thanks in advance !!
CodePudding user response:
You can use
^(?=.{12}$)[0-9a-zA-Z]*\s*$
If at least one letter must exist:
^(?=.{12}$)[0-9a-zA-Z] \s*$
Details:
^- start of string(?=.{12}$)- the string must contain 12 chars[0-9a-zA-Z]*- zero or more alphanumeroics\s*- zero or more whitespaces$- end of string.
See the regex demo.
CodePudding user response:
You may use this regex:
^(?!.*\h\S)[\da-zA-Z\h]{12}$
RegEx Details:
^: Start(?!.*\h\S): Negative lookahead to fail the match if a whitespace is followed by a non-whitespace character[\da-zA-Z\h]{12}: Match 12 characters of alphanumerics or white space$: End
CodePudding user response:
Use a non-word boundary \B:
^(?:[a-zA-Z0-9]|\s\B){12}$
With it, a space can't be followed by a letter or a digit, but only by a non-word character (a space here) or the end of the string.
To ensure at least one character that isn't blank:
^[a-zA-Z0-9](?:[a-zA-Z0-9]|\s\B){11}$
Note that with PCRE you have to use the D (DOLLAR END ONLY) modifier to be sure that $ matches the end of the string and not before the last newline sequence. Or better replace $ with \z. There isn't this kind of problem with Python and the re module.
