Ruby RegEx problem text.gsub[^\W-], '') fails

>> 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


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.

.gsub([^\W-], '').downcase

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 )

.downcase

Which just converts the string to lower case.

Hope this helps :-)


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

Tags:

Ruby

Regex