Javascript正则表达式和非捕获括号

时间:2012-03-29 14:31:02

标签: javascript regex

我的正则表达式和Javascript上有点生疏。我有以下字符串var:

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

我想提取114787535263592217770811582323198738186831542

我尝试使用非捕获括号(?:)

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

但我得到的结果(["tabs_added[114787535263592]", "2"])并不是我的预期 - 我做错了什么?这是一个jsFiddle:http://jsfiddle.net/KgpAw/

4 个答案:

答案 0 :(得分:5)

你非常接近。您还需要捕获+。否则,您只捕获一个十进制数字:

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

您还应该让全局正则表达式找到所有匹配项:

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

然后你应该遍历结果,你也不需要拥有非捕获组,因为你没有使用量化器(?+或{{1你也不需要将*[放在一个字符类中:

]

JSFiddle Example

注意:只要有可用的控制台,最好使用var regexp = /tabs_added\[(\d+)\]/g; var result; while(null != (result = regexp.exec(subject))){ document.write(result[1] + '<br />'); } 进行调试,而不是console.log。 (Chrome,Opera,IE9和Firefox都内置了控制台,我认为Safari也是如此,所以你应该有一个可用的。)document.write在记录对象和数组时提供了更有价值的信息。

答案 1 :(得分:2)

您需要全局标记并匹配所有数字:(\d+)而不是(\d)+

并且不需要所有那些非捕获子组。

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

答案 2 :(得分:1)

您好我可以在一行代码中解决上述要求。

<!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>

答案 3 :(得分:0)

对于多个匹配,您需要使用g修饰符。请尝试以下

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

这仍然包含tabs_added部分,但可以单独删除