Take the 2-minute tour ×

I'm trying to learn Regex in Ruby, based on what I'm reading in "The Rails Way". But, even this simple example is stumping me. I can't tell if it is a typo or not...

text.gsub(/\s/, "-").gsub([^\W-], '').downcase

It seems to me that this would replace all spaces with -, then anywhere a string starts with a non letter or number followed by a dash, replace that with ''. But, using irb, it fails first on ^ "syntax error, unexpected '^', expecting ']'", and if I take out the ^, it fails again on the W.

I'm pretty confused here.

share|improve this question
add comment

5 Answers

up vote 9 down vote accepted
>> text = "I love spaces"
=> "I love spaces"
>> text.gsub(/\s/, "-").gsub(/[^\W-]/, '').downcase
=> "--"

Missing //

Although this makes a little more sense :-)

>> text.gsub(/\s/, "-").gsub(/([^\W-])/, '\1').downcase
=> "i-love-spaces"

And this is probably what is meant

>> text.gsub(/\s/, "-").gsub(/[^\w-]/, '').downcase
=> "i-love-spaces"

\W means "not a word" \w means "a word"

The // generate a regexp object

/[^\W-]/.class => Regexp

share|improve this answer
add comment

You forgot the slashes. It should be /[^\W-]/

share|improve this answer
add comment

The slashes are to say that the thing between them is a regular expression, much like quotes say the thing between them is a string.

share|improve this answer
add comment

Well, .gsub(/[^\W-]/,'') says replace anything that's a not word nor a - for nothing.

You probably want

=> "i-love-spaces"

Lower case \w (\W is just the opposite)

share|improve this answer
Beautiful. That worked perfectly. Thanks. –  scubabbl Sep 26 '08 at 11:26
add comment

Step 1: Add this to your bookmarks. Whenever I need to look up regexes, it's my first stop

Step 2: Let's walk through your code

text.gsub(/\s/, "-")

You're calling the gsub function, and giving it 2 parameters.
The first parameter is /\s/, which is ruby for "create a new regexp containing \s (the // are like special "" for regexes).
The second parameter is the string "-".

This will therefore replace all whitespace characters with hyphens. So far, so good.


Next you call gsub again, passing it 2 parameters. The first parameter is [^\W-]. Because we didn't quote it in forward-slashes, ruby will literally try run that code. [] creates an array, then it tries to put ^\W- into the array, which is not valid code, so it breaks.
Changing it to /[^\W-]/ gives us a valid regex.

Looking at the regex, the [] says 'match any character in this group. The group contains \W (which means non-word character) and -, so the regex should match any non-word character, or any hyphen.

As the second thing you pass to gsub is an empty string, it should end up replacing all the non-word characters and hyphens with empty string (thereby stripping them out )


Which just converts the string to lower case.

Hope this helps :-)

share|improve this answer
add comment

Your Answer


