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