Need a regex that will check if the string only consist letters a-z and numbers and underscore(_) and hyphen(-)

前端 未结 5 475
甜味超标
甜味超标 2020-12-31 10:39

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,

相关标签:
5条回答
  • 2020-12-31 10:50

    Shortest one:

    /^[\w-]+$/

    0 讨论(0)
  • 2020-12-31 10:51

    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.

    0 讨论(0)
  • 2020-12-31 10:52

    The regex should be: '^[\w\d-]+$'

    0 讨论(0)
  • 2020-12-31 10:54

    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
    
    0 讨论(0)
  • 2020-12-31 11:06

    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

    0 讨论(0)
提交回复
热议问题