简体   繁体   中英

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/

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.

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;

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>

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM