views:

82

answers:

3

Hi Guys

I don't understand Regular Expressions that well.

I need an expression that will only accept:
numbers
normal letters (no special characters)
-

spaces are not allowed either.

Example: The regular expression should match:
this-is-quite-alright

It should not match
this -is/not,soålright

+8  A: 

You can use:

^[A-Za-z0-9-]*$

This matches strings, possibly empty, that is wholly composed of uppercase/lowercase letters (ASCII A-Z), digits (ASCII 0-9), and a dash.

This matches (as seen on rubular.com):

this-is-quite-alright
and-a-1-and-a-2-and-3-4-5

yep---------this-is-also-okay

And rejects:

this -is/not,soålright
hello world

Explanation:

  • ^ and $ are beginning and end of string anchors respectively
    • If you're looking for matches within a string, then you don't need the anchors
  • [...] is a character class
    • a-z, A-Z, 0-9 in a character class define ranges
    • - as a last character in a class is a literal dash
  • * is zero-or-more repetition

regular-expressions.info


Variation

The specification was not clear, but if - is only to be used to separate "words", i.e. no double dash, no trailing dash, no preceding dash, then the pattern is more complex (only slightly!)

  _"alpha"_    separating dash
 /         \  /
^[A-Za-z0-9]+(-[A-Za-z0-9]+)*$
 \__________/| \__________/|\
    "word"   |    "word"   | zero-or-more
             \_____________/
              group together

This matches strings that is at least one "word", where words consists of one or more "alpha", where "alpha" consists of letters and numbers. More "words" can follow, and they're always separated by a dash.

This matches (as seen on rubular.com):

this-is-quite-alright
and-a-1-and-a-2-and-3-4-5

And rejects:

--no-way
no-way--
no--way
polygenelubricants
Thank you for the explanation.I went with this and it works like a charm :)
BrinthHillerup
The last thing.. Can you make it reject -- as well?
BrinthHillerup
Works perfect :)If anybody is wondering, it is used to validate a SEO optimized slug for an URL. likewww.mydomain.com/57/{slug}.aspx
BrinthHillerup
@polygenelubricants: As always, great detailed answer +1 :)
Sarfraz
@sAc: for what it's worth, I'm sure this is a dupe. It's just faster to answer it than to look for the dupe.
polygenelubricants
@Brinth: if you look around, there are many questions about URL slugging, both matching and transforming. That is, there is already a question (or ten!) about transforming `"Hey! How are you, buddy!"` to `hey-how-are-you-buddy`, which I'm sure is sufficiently answered. Just look around. Actually, let me just do that also and I'll update this answer with links to those questions. For now, look at the community wiki answer.
polygenelubricants
Okay I didn't search for the slugging questions however I don't need to transform anything.. I need it to be well thought of and no nessecarily the same as the title. The title could easily contain words like "and,or,if,which". All words that I don't need in my url for the specific SEO project. But thanks for all thorough walkthrough of everything.
BrinthHillerup
A: 
[A-z0-9-]+

But your question is confusing as it asks for letters and numbers and has an example containing a dash.

Chris Diver
@Chris Diver: You are missing the capitals `A-Z`
Sarfraz
@Chris: http://stackoverflow.com/questions/3148240/regex-why-doesnt-01-12-range-work-as-expected/ -- see A-Z examples. `A-z` is legal, but includes 6 additional non-letter characters.
polygenelubricants
@polygenelubricans Didn't know that, it would make sense if it also matched the ASCII characters between Z and a
Chris Diver
A: 

This is a community wiki, an attempt to compile links to related questions about this "URL/SEO slugging" topic. Community is invited to contribute.

Related questions

Related tags

polygenelubricants