JavaScript 正则表达式 : Ignore closing bracket when enclosed in parentheses

标签 javascript regex

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

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

相关文章:

Java 从字符串中删除除 x 以外的非数字字符

javascript - MongoDB Node.js 驱动程序 : callback does not handle exceptions on insert

javascript - 面板在 ExtJ 中占用了不必要的巨大空间

javascript - ElasticSearch client.indices.putMapping 总是失败

iphone - 在 UIWebView 中打开的 HTML 页面中自动填充用户名和密码

c# - 具有量化部分和负向前瞻的正则表达式

python - 忽略外部分组并仅返回交替匹配的组

javascript - Jquery发送post表单ajax不起作用

javascript - Javascript 函数完成后 Overlay Div 消失

javascript - 如何将大字符串中的某些字符串插入数组