Why is this regex allowing a caret?

Because your character class [A-z] matches this symbol.

[A-z] matches [, \, ], ^, _, `, and the English letters.

Actually, it is a common mistake. You should use [a-zA-Z] instead to only allow English letters.

Here is a visualization from Expresso, showing what the range [A-z] actually covers:

screenshot from Expresso showing the ASCII table, where you can see what the [A-z] range actually covers

So, this regex (with i option) won’t capture your string.

^(?=.*[0-9])(?=.*[a-z])[0-9a-z-]{17}$

In my opinion, it is always safer to use Ignorecase option to avoid such an issue and shorten the regex.

Leave a Comment