繁体   English   中英

Javascript正则表达式:括在括​​号中时忽略右括号

[英]Javascript regex: Ignore closing bracket when enclosed in parentheses

我有一个带有几个(可选)捕获组的正则表达式。 我正在尝试添加一项新功能,该功能允许用户将内容添加到与正则表达式的右括号匹配的捕获组之一。 我正在努力忽略这场比赛

当前的正则表达式是/\\[(.+?)=(.+?)(?:\\|(.+?))?(?:\\:(.+?))?\\]/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

查看正则表达式演示

请注意,惰性点匹配模式被更严格的否定字符类替换,以确保括号字符串的一部分不会溢出到另一部分。 为了允许匹配第一级嵌套的[...]子字符串, \\[[^\\][]*]|[^\\]]模式用于匹配[...]或非]子字符串。

详情

  • \\[ - 文字[
  • ([^=\\]]+) - 第 1 组捕获 1+ 个字符,而不是=]
  • = - a =符号
  • ((?:\\[[^\\][]*]|[^\\]])+?) - 第 2 组捕获 1+ 次(尽可能少):
    • \\[[^\\][]*] - [ ,然后是][以外的 0+ 个字符,然后是]
    • | - 或者
    • [^\\]] - 除]以外的任何字符
  • (?:\\|([^:\\]]+):((?:\\[[^\\][]*]|[^\\]])+?))? - 可选的组匹配:
    • \\| - 一个| 字符
    • ([^:\\]]+) - 第 3 组捕获:]以外的 1+ 个字符
    • : - 一个冒号
    • ((?:\\[[^\\][]*]|[^\\]])+?) - 第 4 组捕获与第 2 组相同的文本。
  • ] - 文字]字符。

我可能会将它分解为两个单独的正则表达式并“或”它们。 下面我用你的表达式来匹配第一种字符串:

\[(?:(.+?)=(.+)(?:\|(.+?)?\:(.+?)))\]
[key=value|filter:filtervalue]

另一个是第二个:

\[(.+?)=(.+)\]
[data=example(products[0].id)]

然后将它们连接到:

\[(?:(.+?)=(.+)(?:\|(.+?)?\:(.+?))|(.+?)=(.+))\]

它首先尝试匹配棘手的部分,如果失败,则求助于更通用的部分。

https://regex101.com/r/d6LwEt/1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM