Javascript正则表达式,确定匹配的组

Javascript正则表达式,确定匹配的组,javascript,regex,match,Javascript,Regex,Match,我有以下javascript中的正则表达式用于匹配类似于book[n],book[1,2,3,4,5,…,n],book[author=“Kristian”]和book[id=n](n是任意数): 我可以通过以下方式使用它: // If there is no match in any of the groups hasOp will be null hasOp = opRegex.exec('books[0]'); /* Result: ["[0]", index: 5, input: "b

我有以下javascript中的正则表达式用于匹配类似于
book[n]
book[1,2,3,4,5,…,n]
book[author=“Kristian”]
book[id=n]
(n是任意数):

我可以通过以下方式使用它:

// 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]"]
*/
如上所示,我不仅得到了值,还得到了[and]。我可以通过使用组来避免这种情况。因此,我将正则表达式更改为:

var opRegex = /\[([0-9]+)\]|\[([0-9]+,.*)\]|\[([a-zA-Z]+=".+")\]/gi;
运行与上述相同的程序,结果将改为:

["[0]", "0", undefined, undefined, index: 5, input: "books[0]"]
上面我得到了数组中索引为1、2和3的组。对于本例,匹配项位于第一个正则表达式组中,但如果匹配项位于第二个正则表达式组中,则匹配项将位于索引2或数组中

我可以更改我的第一个正则表达式以获得不带括号的值,还是使用分组方法和while循环来获得第一个定义的值

我还缺什么?它贪婪吗


如果您需要更多信息,请告诉我,我很乐意提供。

我有一些建议。首先,特别是因为您正在寻找文字括号,所以尽可能避免使用正则括号(例如,将
[0-9]
替换为
\d
)。另外,您允许在
*
中使用多个引号,因此我将其更改为
“?
。但最重要的是,我将括号的匹配项移到了替换项之外,因为它们应该在每个替换项中。这样,无论哪个部分匹配,您都拥有相同的组

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

太棒了!你能解释一下“在交替之外。。。我不太明白。基本上,你需要分组(paren)之外的括号,所以它们不是匹配组的一部分。你在第二个正则表达式中这样做了,但是你有三个独立的分组,而不是一个主分组。在解决方案中,只有一组paren,所以只有一个组。
/\[(\d+(,\d+)*|[a-zA-Z]+="?[^\]]+"?)\]/gi