我有一个带有几个(可选)捕获组的正则表达式。我正在尝试添加一项新功能,允许用户将内容添加到与正则表达式的右括号匹配的捕获组之一。我很难忽略这场比赛
当前正则表达式为 /\[(.+?)=(.+?)(?:\|(.+?))?(?:\:(.+?))?\]/g
这允许用户根据以下内容定位数据:
[key=value|filter:filtervalue]
其中filter和filtervalue是可选的。
问题是,对于该值,现在应该可以将数组中的索引作为目标。例如:
[data=example(products[0].id)]
但是,正则表达式仅匹配 .id
,因此第二个捕获组是 example(products[0
)。我希望它是 example( products[0].id)
。我想如果我可以忽略用括号括起来的右括号,应该没问题,但我一直不知道如何实现。
应匹配的示例:
[data=example(products[0].id)]
[data=example(products[index].id)]
[data=regular]
[data=test|number:2]
我创建了一个regex101 。如有任何帮助,我们将不胜感激。
最佳答案
您可以使用
/\[([^=\]]+)=((?:\[[^\][]*]|[^\]])+?)(?:\|([^:\]]+):((?:\[[^\][]*]|[^\]])+?))?]/g
请参阅regex demo
请注意,惰性点匹配模式被替换为更具限制性的否定字符类,以确保括号字符串的一个部分不会溢出到另一部分。为了允许匹配第一级嵌套 [...]
子字符串,使用 \[[^\][]*]|[^\]]
模式来匹配使用 [...]
或非 ]
子字符串。
详细信息:
\[
- 文字[
([^=\]]+)
- 第 1 组捕获除=
和]
之外的 1 个以上字符=
-=
符号((?:\[[^\][]*]|[^\]])+?)
- 第 2 组捕获 1+ 次出现(尽可能少):\[[^\][]*]
-[
,然后是]
和[< 之外的 0+ 个字符
,然后]
|
- 或[^\]]
- 除]
之外的任何字符
(?:\|([^:\]]+):((?:\[[^\][]*]|[^\]])+?))?
- 可选的组匹配:\|
-|
字符([^:\]]+)
- 第 3 组捕获除:
和]
之外的 1 个以上字符:
- 冒号((?:\[[^\][]*]|[^\]])+?)
- 第 4 组捕获与第 2 组相同的文本。
]
- 文字]
字符。
关于JavaScript 正则表达式 : Ignore closing bracket when enclosed in parentheses,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41591534/