Javascript正则表达式:当括在括号中时忽略右括号
我有一个带有几个(可选)捕获组的正则表达式。我正在尝试添加一个新功能,允许用户将内容添加到与正则表达式结束括号匹配的捕获组之一。我很难忽视这场比赛 当前正则表达式是Javascript正则表达式:当括在括号中时忽略右括号,javascript,regex,Javascript,Regex,我有一个带有几个(可选)捕获组的正则表达式。我正在尝试添加一个新功能,允许用户将内容添加到与正则表达式结束括号匹配的捕获组之一。我很难忽视这场比赛 当前正则表达式是/\[(.+?)=(.+?)(?:\\\\;(.+?)?(?:\:(.+?))?\]/g 这允许用户根据以下条件确定数据目标: [key=value|filter:filtervalue] 其中filter和filtervalue是可选的 问题是,对于值,现在应该可以在数组中以索引为目标。例如: [data=example(prod
/\[(.+?)=(.+?)(?:\\\\;(.+?)?(?:\:(.+?))?\]/g
这允许用户根据以下条件确定数据目标:
[key=value|filter:filtervalue]
其中filter和filtervalue是可选的
问题是,对于值,现在应该可以在数组中以索引为目标。例如:
[data=example(products[0].id)]
但是,正则表达式最多只匹配.id
,因此第二个捕获组是示例(产品[0
)。我希望它是示例(产品[0].id)
。我想如果在用括号括起来时可以忽略右括号,我会很好,但我一直无法弄清楚怎么做
应匹配的示例:
[data=example(products[0].id)]
[data=example(products[index].id)]
[data=regular]
[data=test|number:2]
我创建了一个。非常感谢您的帮助。我可能会将其分解为两个单独的正则表达式和“或”它们。 下面我使用了您的表达式来匹配第一种字符串:
\[(?:(.+?)=(.+)(?:\|(.+?)?\:(.+?)))\]
[key=value|filter:filtervalue]
另一个用于第二个:
\[(.+?)=(.+)\]
[data=example(products[0].id)]
然后将它们连接到:
\[(?:(.+?)=(.+)(?:\|(.+?)?\:(.+?))|(.+?)=(.+))\]
它首先尝试匹配棘手的部分,如果失败,则求助于更一般的部分
您可以使用
/\[([^=\]]+)=((?:\[[^\][]*]|[^\]])+?)(?:\|([^:\]]+):((?:\[[^\][]*]|[^\]])+?))?]/g
见
请注意,惰性点匹配模式将替换为限制性更强的否定字符类,以确保括号内字符串的一部分不会溢出到另一部分。要允许匹配第一级嵌套的[…]
子字符串,请使用\[^\][*]|[^\]
模式来匹配[…]使用了
或非]子字符串
详细信息:
-文字\[
[
-第1组捕获1个以上字符,而不是([^=\]]+)
和=
]
-a=
符号=
-第2组捕获1+次(尽可能少)以下事件:((?:\[[^\][*]|[^\]])+?)
-\[^\][]*]
,然后是0+字符,而不是[
和]
,然后是[
]
-或|
-除[^\]]
]
-可选组匹配:(?:\\\\]([^:\]]+):((?:\[^\][*].[^\]])+)?
-a\\\\\\
字符\
-第3组捕获1+个字符,而不是([^:\]]+)
和:
]
-冒号:
-第4组捕获与第2组相同的文本((?:\[[^\][*]|[^\]])+?)
-文字]
字符]