我在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循环来获取第一个定义的值?
我还缺少什么?它贪婪吗?
如果您需要更多信息,请告诉我,我们很乐意提供这些信息。
答案 0 :(得分:2)
我有一些建议。首先,特别是因为您正在寻找文字括号,所以尽可能避免使用正则表达式括号(例如,将[0-9]
替换为\d
)。此外,您允许使用*
的多个引号,因此我将其更改为"?
。但最重要的是,我在交替之外移动了括号的匹配,因为它们应该在每个替代匹配中。这样,无论哪个部分匹配,您都拥有相同的组。
/\[(\d+(,\d+)*|[a-zA-Z]+="?[^\]]+"?)\]/gi