4

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/

3
  • Your (?:) group looks fine, but the (?+) looks fishy. Commented Mar 29, 2012 at 14:35
  • @andrewcooke Sorry about that, I messed up when pasting. It's a ?:. Commented Mar 29, 2012 at 14:35
  • @T.J.Crowder You're totally right. I added a link to jsFiddle that shows what the result is. Commented Mar 29, 2012 at 14:38

4 Answers 4

5

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.

Sign up to request clarification or add additional context in comments.

Comments

2

You need global flag and match all digits: (\d+) instead of (\d)+.

And don't need all those non-capturing subgroups.

var regexp = /tabs_added\[(\d+)\]/g;
var pageIds = [], match;
while(match = re.exec(str)) pageIds.push(match[1]);
pageIds;

Comments

1

Hi i can solve above requirement in one line code.

<!DOCTYPE html>
<html>
<body>

<script>
var str="/admin.php?page=settings&tabs_added[114787535263592]=1&tabs_added[217770811582323]=1&tabs_added[198738186831542]=1"; 
var patt1=/\d{15}/g; 
document.write(str.match(patt1));
</script>

</body>
</html>

Comments

0

For multiple matches, you need to use the g modifier. Please try the following

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

This will still contain the tabs_added part, but that can be removed separately

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.