1

我在 javascript 中有以下正则表达式,用于匹配类似于book[n]book[1,2,3,4,5,...,n]和(n 是任意数字):book[author="Kristian"]book[id=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 循环来获取第一个定义的值?

还有什么我想念的吗?是贪心吗?

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

4

1 回答 1

2

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

/\[(\d+(,\d+)*|[a-zA-Z]+="?[^\]]+"?)\]/gi
于 2013-04-09T19:00:11.633 回答