匹配特定单词和其后的成对括号之间的字符串,具有单个嵌套级别支持,但有异常

Match string between a specific word and paired brackets after it with a single nested level support with an exception

我遇到了正则表达式匹配问题。我需要在字符串中找到特定的子字符串。一些例子:

1. IF[A != B; C[0]; D] ==> IF[A != B; C[0]; D]
2. IF[A != B; IF[E < F; ...; ...]; D] ==> IF[E < F; ...; ...]
3. IF[A != B; C; D] ==> IF[A != B; C; D]

所以,我有这个正则表达式:IF\[([^\[\]]*)\]。它在情况 2 和情况 3 中工作正常,但在情况 1 中有 C[0] 包含方括号。

我尝试以这种方式更改我的正则表达式:IF\[((?!IF))\],最后 IF\[(.+(?!IF))\]。我加了个提前说一下"keep the IF that does not contains another IF"。现在它适用于情况 1 和 3 但情况 2 returns 整个字符串。

如何创建正确的外观头来解决这个问题?我需要在字符串中找到最内部的IF,可以是整个字符串。

我已经在这个答案中尝试过解决方案:

您想匹配 IF[...] 个子字符串,其中方括号之间的字符串可能包含另一对方括号,除非前面有 IF,只有一个嵌套的括号级别。

为此,您可以使用

IF\[([^][]*(?:(?<!\bIF)\[[^][]*][^][]*)*)]

regex demo

详情

  • IF\[ - IF[ 子串
  • ([^][]*(?:(?<!\bIF)\[[^][]*][^][]*)*) - 第 1 组:
    • [^][]* - []
    • 以外的 0+ 个字符
    • (?:(?<!\bIF)\[[^][]*][^][]*)* - 出现 0 次或多次
      • (?<!\bIF)\[ - [ 字符前面没有紧跟整个单词 IF\b 是单词边界)
      • [^][]* - []
      • 以外的 0+ 个字符
      • ] - 一个 ] 字符
      • [^][]* - []
      • 以外的 0+ 个字符
  • ] - 一个 ] 字符。