I'm struggling to write a regex that matches the following requirements:
- up to 20 characters (English letters and numbers)
- may have one optional dash ( - ) but can't start or end with it
I could come up with this patters: ^[a-zA-Z0-9-]{0,20}$ but this one allows for multiple dashes and one may enter the dash at the begin/end of the input string.
CodePudding user response:
You can use
^(?=.{0,20}$)(?:[a-zA-Z0-9] (?:-[a-zA-Z0-9] )?)?$
See the regex demo.
Details:
^- start of string(?=.{0,20}$)- zero to twenty chars allowed in the string(?:- a non-capturing group start:[a-zA-Z0-9]- one or more alphanumeric chars(?:-[a-zA-Z0-9] )?- an optional sequence of a-and one or more alphanumeric chars
)?- end of the non-capturing group, repeat one or zero times (i.e. the pattern match is optional)$- end of string.
CodePudding user response:
Have a try with:
^(?:[^\W_]{1,20}|(?!.{22})[^\W_] -[^\W_] )$
See an online demo
^- Start-line anchor;(?:- Open non-capture group;[^\W_]{1,20}- Match between 1-20 alphanumeric characters;|- Or;(?!.{22})[^\W_] -[^\W_]- Negative lookahead to assert position is not followed by 22 characters, and next we matching 1 alphanumeric characters between an hyphen;
)$- Close non-capture group before matching end-line anchor.
Note that the above assumes upto 20 alphanumeric characters but with one optional hyphen that would take the max count to 21 characters.
CodePudding user response:
You can match two different regex and put both regex in OR:
First regex is to match:
- up to 20 chars (no dash admitted)
^\w{1,20}
Second regex is to match:
- one character at start (no dash)
- optional up to 18 characters or dashes
- one final character (no dash)
^\w[\w-]{1,18}\w$
Complete solution:
^\w{0,20}$|^\w[\w-]{0,18}\w$
