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

4

我的正则表达式和Javascript有些生疏。我有以下字符串变量:

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/


你的 (?:) 组看起来不错,但是 (?+) 看起来有问题。 - Pointy
@andrewcooke 抱歉,我复制粘贴时弄错了。应该是?: - julien_c
@T.J.Crowder 你说得完全正确。我添加了一个指向 jsFiddle 的链接,展示了结果是什么。 - julien_c
4个回答

5
你很接近了,你需要同时捕获+。否则,你只能捕获一个十进制数字:
var regexp = /(?:tabs_added[\[])(\

你还应该将你的正则表达式设置为全局,以便找到所有匹配项:
var regexp = /(?:tabs_added[\[])(\d+)(?:[\]])/g;

然后您应该遍历结果,您也不需要非捕获组,因为您没有在它们上面使用定量器(?+*),也不必将[]放在字符类中:

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

JSFiddle示例

注意:如果你有控制台可用的话(Chrome、Opera、IE9和Firefox内置了控制台,我认为Safari也有),在调试目的上最好使用console.log而不是document.write。当记录对象和数组时,console.log提供了更有价值的信息。


2
你需要使用全局标志,并匹配所有数字:(\d+),而不是(\d)+
并且不需要所有这些非捕获子组。
var regexp = /tabs_added\[(\d+)\]/g;
var pageIds = [], match;
while(match = re.exec(str)) pageIds.push(match[1]);
pageIds;

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>

0

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接