我的正则表达式和Javascript上有点生疏。我有以下字符串var:
var subject = "/admin.php?page=settings&tabs_added[114787535263592]=1&tabs_added[217770811582323]=1&tabs_added[198738186831542]=1"
我想提取114787535263592
,217770811582323
和198738186831542
。
我尝试使用非捕获括号(?:)
:
var regexp = /(?:tabs_added[\[])(\d)+(?:[\]])/;
var pageid = regexp.exec(subject);
但我得到的结果(["tabs_added[114787535263592]", "2"]
)并不是我的预期 - 我做错了什么?这是一个jsFiddle:http://jsfiddle.net/KgpAw/
答案 0 :(得分:5)
你非常接近。您还需要捕获+
。否则,您只捕获一个十进制数字:
var regexp = /(?:tabs_added[\[])(\
您还应该让全局正则表达式找到所有匹配项:
var regexp = /(?:tabs_added[\[])(\d+)(?:[\]])/g;
然后你应该遍历结果,你也不需要拥有非捕获组,因为你没有使用量化器(?
,+
或{{1你也不需要将*
和[
放在一个字符类中:
]
注意:只要有可用的控制台,最好使用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部分,但可以单独删除