views:

55

answers:

3

Suppose we don't know how many slashes we could get in a string but we do not want any extra slashes. So if we get this string '/hello/world///////how/are/you//////////////' we should transform it to the form of '/hello/world/how/are/you/'. How to do it with the help of regular expressions in JavaScript?

+3  A: 
"/hello/world///////how/are/you//////////////".replace(/\/+/g, "/")
mkoryak
Thanks, it answers my question.
Alex Polo
By the way, what does that g letter mean?
Alex Polo
global replace, so basically it makes it a replaceAll which is what you want
mkoryak
Just expanding on the `g`: if it wasn't there, it would replace the first instance of `/` and then give up. The `g` flag effectively means, "keep on going until you've got them all."
David Foster
Yep, David, thanks for the explanation.
Alex Polo
A: 

Edited: mkoryak's answer below is way better. Leaving this in case the info it contains is useful for someone else.

You could capture each word + slash group and look ahead (but don't capture) for one or more extra slash. Like...

(\w+\/)(?:\/)*(\w+\/)(?:\/)*

First () captures one or more of any word character followed by a slash, second () looks for a slash but doesn't capture, * means find 0 or more of the proceeding token. Etc.

Hope that helps!

jonathonmorgan
+1  A: 
'/hello/world///////how/are/you//////////////'.replace(/\/{2,}/g, '/');

This might be an incy wincy bit faster than mkoryak's suggestion, for it will only replace where necessary – i.e., where there's multiple instances of /. I'm sure someone with a better understanding of the nuts and bolts of the JavaScript regular expression engine can weigh in on this one.

UPDATE: I have now profiled mine and mkoryak's solutions using the above string but duplicated hundreds of times, and I can confirm that my solution consistently worked out several milliseconds faster.

David Foster
Myself I tried doing the way you suggested ({2,}), but without the g letter. So it didn't work properly (replaced only once).
Alex Polo