tags:

views:

2487

answers:

5

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.

+2  A: 

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

Khoth
+7  A: 
>> 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

Vinko Vrsalovic
+1  A: 

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.

Khoth
+2  A: 

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

You probably want

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

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

Vinko Vrsalovic
Beautiful. That worked perfectly. Thanks.
scubabbl
+1  A: 

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

Orion Edwards