admin管理员组

文章数量:1202044

I would like to test if user type only alphanumeric value or one "-".

hello-world                 -> Match
hello-first-world           -> match
this-is-my-super-world      -> match
hello--world                -> NO MATCH
hello-world-------this-is   -> NO MATCH
-hello-world                -> NO MATCH (leading dash)
hello-world-                -> NO MATCH (trailing dash)

Here is what I have so far, but I dont know how to implement the "-" sign to test it if it is only once without repeating.

var regExp = /^[A-Za-z0-9-]+$/;

I would like to test if user type only alphanumeric value or one "-".

hello-world                 -> Match
hello-first-world           -> match
this-is-my-super-world      -> match
hello--world                -> NO MATCH
hello-world-------this-is   -> NO MATCH
-hello-world                -> NO MATCH (leading dash)
hello-world-                -> NO MATCH (trailing dash)

Here is what I have so far, but I dont know how to implement the "-" sign to test it if it is only once without repeating.

var regExp = /^[A-Za-z0-9-]+$/;
Share Improve this question edited Sep 24, 2010 at 14:34 NullUserException 85.5k30 gold badges211 silver badges237 bronze badges asked Sep 24, 2010 at 14:10 praethorianpraethorian 8121 gold badge9 silver badges16 bronze badges 3
  • 2 Can it begin or end with a "-" ? – myermian Commented Sep 24, 2010 at 14:13
  • no, it should not start or end with "-" – praethorian Commented Sep 24, 2010 at 14:16
  • Should "foo" be a match, or not a match? – T.J. Crowder Commented Sep 24, 2010 at 16:05
Add a comment  | 

5 Answers 5

Reset to default 19

Try this:

/^[A-Za-z0-9]+(?:-[A-Za-z0-9]+)*$/

This will only match sequences of one or more sequences of alphanumeric characters separated by a single -. If you do not want to allow single words (e.g. just hello), replace the * multiplier with + to allow only one or more repetitions of the last group.

Here you go (this works).

var regExp = /^[A-Za-z0-9]+([-]{1}[A-Za-z0-9]+)+$/;

letters and numbers greedy, single dash, repeat this combination, end with letters and numbers.

(^-)|-{2,}|[^a-zA-Z-]|(-$) looks for invalid characters, so zero matches to that pattern would satisfy your requirement.

I'm not entirely sure if this works because I haven't done regex in awhile, but it sounds like you need the following:

/^[A-Za-z0-9]+(-[A-Za-z0-9]+)+$/

You're requirement is split up in the following:

  • One or more alphanumeric characters to start (that way you ALWAYS have an alphanumeric starting.
  • The second half entails a "-" followed by one or more alphanumeric characters (but this is optional, so the entire thing is required 0 or more times). That way you'll have 0 or more instances of the dash followed by 1+ alphanumeric.

I'm just not sure if I did the regex properly to follow that format.

The expression can be simplified to: /^[^\W_]+(?:-[^\W_]+)+$/

Explanation:

^             match the start of string
[^\W_]+       match one or more word(a-zA-Z0-9) chars 
(?:-[^\W_]+)+ match one or more group of '-' follwed by word chars
$             match the end of string

Test: https://regex101.com/r/MODQxw/1

本文标签: javascriptRegex to match 3939 delimited alphanumeric wordsStack Overflow