Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/452.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript正则表达式:当括在括号中时忽略右括号_Javascript_Regex - Fatal编程技术网

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组相同的文本
  • ]
    -文字
    ]
    字符

你能提供一个应该匹配和不应该匹配的示例列表吗?@Wiktor。谢谢。这些都很好。我应该提到字符串作为索引应该是可能的。我更新了问题,也许你可以看一下。@sp00m我添加了一些示例。不太担心什么不应该匹配,总之“捕获组中的g为。选中。@Wiktor极好。谢谢。如果您将其作为答案添加,则将接受。谢谢。但是,组不匹配,因此在第一个示例中,值为组6,在第二个组2中。我希望始终在组2中捕获值。”