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

时间:2013-04-09 18:45:42

标签: javascript regex match

我在javascript中使用以下正则表达式匹配类似于book[n]book[1,2,3,4,5,...,n]book[author="Kristian"]book[id=n](n是任意数字):

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循环来获取第一个定义的值?

我还缺少什么?它贪婪吗?

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

1 个答案:

答案 0 :(得分:2)

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

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