I\'m looking for a regex that will check if the string only consists of the letters a-z, numbers, underscore (_
) and hyphen (-
). I have tried this,
Shortest one:
/^[\w-]+$/
You have to put your regex /^a-zA-Z0-9_-$/
in a character class /[...]/
.
It means you can match any character in the character class. You should also specify a quantifier, because /^[a-zA-Z0-9_-]$/
will match only one character.
Examples:
/^[a-zA-Z0-9_-]+$/
with the +
sign you match it one or more time
/^[a-zA-Z0-9_-]{1,}$/
the same as above
/^[a-zA-Z0-9_-]{10,20}$/
between 10 and 20 character long.
/^[a-zA-Z0-9_-]{15}$/
it has to be exactly 15 characters long. You can use it to check the string length.
You can also use the following keyword to make your regex easy to read:
/^[\w-]+$/
which matches a word character (including underscore, letters and digits) or a dash, one or more time.
The regex should be: '^[\w\d-]+$'
I would use this one:
/^[a-z_\-\d]+$/i
As to why I'm not using \w
, the following quote, taken from PHP PCRE Pattern Reference, should explain why you shouldn't be using \w
in this situation:
A "word" character is any letter or digit or the underscore character, that is, any character which can be part of a Perl "word". The definition of letters and digits is controlled by PCRE's character tables, and may vary if locale-specific matching is taking place. For example, in the "fr" (French) locale, some character codes greater than 128 are used for accented letters, and these are matched by
\w
.
That behavior is not desirable in this case, so unless you want to worry about locale, use straight character classes instead of the \w
shorthand.
If you want to specify a minimum length (for example 3):
/^[a-z_\-\d]{3,}$/i
If you want to specify both a minimum and maximum length (for example 2 and 5):
/^[a-z_\-\d]{2,5}$/i
The answers so far correctly explain the character class /^[A-Za-z0-9_-]+$
/
You can check the length. + means "one or more of the preceding", * means zero or more of the preceding" and {2,4} means "between 2 and 4 of the preceding".
You can't specify the length has to be a prime, though. Specifying that the length has to be even is possible but non-trivial: /^(xx){1,3}$
/ matches xx, xxxx or xxxxxx. The count here refers to the number of pairs, not the number of x'es