我有一些带有几个(可选)捕获组的正则表达式。我尝试添加一项新功能,允许用户将内容添加到与正则表达式的结束括号匹配的其中一个捕获组中。我很难忽视这场比赛
目前的正则表达式为/\[(.+?)=(.+?)(?:\|(.+?))?(?:\:(.+?))?\]/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。任何帮助表示赞赏。
答案 0 :(得分:1)
您可以使用
/\[([^=\]]+)=((?:\[[^\][]*]|[^\]])+?)(?:\|([^:\]]+):((?:\[[^\][]*]|[^\]])+?))?]/g
请参阅regex demo
请注意,延迟点匹配模式将被更严格的否定字符类替换,以确保从括号中的字符串的一部分到另一部分没有溢出。要允许匹配第一级嵌套[...]
子字符串,\[[^\][]*]|[^\]]
模式用于匹配[...]
或非]
子字符串。
<强>详情:
\[
- 文字[
([^=\]]+)
- 第1组捕获除=
和]
=
- 一个=
符号((?:\[[^\][]*]|[^\]])+?)
- 第2组捕获1次以上的事件(尽可能少):
\[[^\][]*]
- [
,然后是]
和[
以外的0 +字符,然后是]
|
- 或[^\]]
- 除]
(?:\|([^:\]]+):((?:\[[^\][]*]|[^\]])+?))?
- 可选组匹配:
\|
- |
字符([^:\]]+)
- 第3组捕获除:
和]
:
- 冒号((?:\[[^\][]*]|[^\]])+?)
- 第4组捕获与第2组相同的文本。]
- 文字]
字符。答案 1 :(得分:0)
我可能会将其分解为两个单独的正则表达式和“或”它们。 下面我使用你的表达式来匹配第一种字符串:
\[(?:(.+?)=(.+)(?:\|(.+?)?\:(.+?)))\]
[key=value|filter:filtervalue]
另一个是第二个:
\[(.+?)=(.+)\]
[data=example(products[0].id)]
然后将它们连接到:
\[(?:(.+?)=(.+)(?:\|(.+?)?\:(.+?))|(.+?)=(.+))\]
它首先尝试匹配棘手的部分,如果失败,则转向更一般的部分。