2013-04-09 30 views
0

我在JavaScript以下正则表达式匹配类似于book[n]book[1,2,3,4,5,...,n]book[author="Kristian"]book[id=n](n是任意数):的Javascript正则表达式,确定哪些组上匹配

var opRegex = /\[[0-9]+\]|\[[0-9]+,.*\]|\[[a-zA-Z]+="*.+"*\]/gi; 

我可以在使用此通过以下方式:

// If there is no match in any of the groups hasOp will be null 
hasOp = opRegex.exec('books[0]'); 

/* 
Result: ["[0]", index: 5, input: "books[0]"] 
*/ 

如上图所示我不仅得到了价值,而且在[和]。我可以通过使用组来避免这种情况。所以我改变了正则表达式:

var opRegex = /\[([0-9]+)\]|\[([0-9]+,.*)\]|\[([a-zA-Z]+=".+")\]/gi; 

运行一样的结果上面将改为:

["[0]", "0", undefined, undefined, index: 5, input: "books[0]"] 

在上面,我得到了集团作为数组索引1,2和3。对于这个例子,匹配是在第一个,但如果匹配在第二个正则表达式组中,匹配将在索引2或数组中。

我可以更改我的第一个正则表达式来获取没有括号的值吗?还是使用分组方法和while循环来获取第一个定义的值?

还有什么我失踪了?它是否贪婪?

让我知道你是否需要更多的信息,我很乐意提供。

回答

2

我有几点建议。首先,特别是因为您正在寻找字面括号,所以请尽量避免使用正则表达式(例如,将[0-9]替换为\d)。此外,您允许使用*多个引号,因此我将其更改为"?。但最重要的是,我在替换之外移动了方括号的比赛,因为它们应该在每次替补比赛中进行。这样,无论哪个部分匹配,您都有相同的组。

/\[(\d+(,\d+)*|[a-zA-Z]+="?[^\]]+"?)\]/gi 
+0

很好用!你能否解释一下“轮换之外......每场替补赛”。我没有完全明白。 – Asken 2013-04-09 19:11:39

+0

基本上,您需要分组外的括号(parens),因此它们不是匹配组的组成部分。你在第二个正则表达式中这样做了,但是你有三个独立的分组,而不是一个主分组。在解决方案中,只有一组parens,所以只有一组。 – 2013-04-09 19:23:39