Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Javascript Regex and non-capturing parentheses

I'm a bit rusty on my regexp and Javascript. I have the following string var:

var subject = "/admin.php?page=settings&tabs_added[114787535263592]=1&tabs_added[217770811582323]=1&tabs_added[198738186831542]=1"

I want to extract 114787535263592, 217770811582323 and 198738186831542.

I've tried to use non-capturing parenthesis (?:) :

var regexp = /(?:tabs_added[\[])(\d)+(?:[\]])/;
var pageid = regexp.exec(subject);

But the result I get (["tabs_added[114787535263592]", "2"]) is not what I expected -- what am I doing wrong? Here's a jsFiddle: http://jsfiddle.net/KgpAw/

like image 812
julien_c Avatar asked Feb 22 '23 00:02

julien_c


1 Answers

You were very close. You need to capture the + as well. Otherwise you only capture one decimal digit:

var regexp = /(?:tabs_added[\[])(\

You should also make your regex global to find all matches:

var regexp = /(?:tabs_added[\[])(\d+)(?:[\]])/g;

Then you should loop through the results, you also don't need to have non-capturing groups because you're not using a quantifier on them (?, +, or *), nor do you need to put your [ and ] inside a character class:

var regexp = /tabs_added\[(\d+)\]/g;
var result;
while(null != (result = regexp.exec(subject))){
    document.write(result[1] + '<br />');
} 

JSFiddle Example

Note: It's better to use console.log for debugging purposes than document.write as long as you have a console available. (Chrome, Opera, IE9, and Firefox have consoles built in, and I think Safari does too, so you should have one available.) console.log provides much more valuable information when logging objects and arrays.

like image 52
Paul Avatar answered Feb 23 '23 15:02

Paul