views:

69

answers:

6

I'm having real difficulty with this but I'm no javascript expert. All I want to do is get myself an array of all matches in a string which match a given regExp. The regExp being this :

[0-9]+

ie. Any integer.

So If I pass the string "12 09:8:76:::54 12" I should get

arr[0]="12" arr[1]="09" arr[2]="8" arr[3]="76" arr[4]="54" arr[5]="12"

Easy? Not for me! I could do this in vb.net no problem with regexp.matches(string) (something like that anyway). I thought that the javascript method .exec would also give me an array however it only returns the first match. What's going on? Code...

function testIt(){
    splitOutSelection2("123:::45  0::12312 12:17"); 
}


function splitOutSelection2(sSelection){
    var regExp = new RegExp("[0-9]+","g");
    var arr = regExp.exec(sSelection);
}; 
+1  A: 
arr = sSelection.match(/[0-9]+/g);

should do.

g is the global modifier that you need to get all the matches, not just the first one.

Tim Pietzcker
Thanks, this works. I realise that I should be using match and not exec. I was specifying the global modifier in my regExp declaration. But it is 'match' that is the key. My code can be rewritten as.. function splitOutSelection2(sSelection){ var regExp = new RegExp("[0-9]+","g"); var arr = sSelection.match(regExp); };
El Ronnoco
A: 

something like:

var arrMatch = "12 09:8:76:::54 12".match(/[0-9]+/g);
alert(arrMatch);

.match will return an array if global is set (and matches are found of course). [0-9]+ means it will search for not only single digits, but also match 12, 09, 76.

WSkid
Thanks. I initially thought that match wasn't working but it was not working because I hadn't set the g flag. This is why I went down the exec route which was incorrect.
El Ronnoco
A: 

You can utilize the code specified in here, use regexpal to test your regex

Sandy
+1  A: 

According to the doc, exec return the first match. You should use match instead.

var arr = sSelection.match(/[0-9]+/g);

or

var arr = sSelection.match(/\d+/g);
M42
A: 

All the answers work but I was wanting to keep my regExp object rather than specify it at the time of use. So simply changing the function to...

function splitOutSelection2(sSelection){
    var regExp = new RegExp("[0-9]+","g");
    var arr = sSelection.match(regExp);
}; 

..is what I was looking for. Thanks for pointing me in the right direction though to all who have replied.

El Ronnoco
A: 
function splitOutSelection2(sSelection){
    return sSelection.split(/[^0-9]+/g);
};

Negate the regExp and use String#split.

Vincent
Thanks, I'm sure this will work too. Is using split and a negated match more efficient than using exec?
El Ronnoco