匹配特定单词之间的字符串,并在其后面加上成对的括号,支持单层嵌套,但有一个例外。

问题描述 投票:1回答:1

我有一个关于regex匹配的问题。我需要在一个字符串中找到一个特定的子串。一些例子。

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]

所以,我有这样一个Regula表达式: IF\[([^\[\]]*)\]. 它在情况2和3中工作得很好,但是在情况1中,出现了 C[0] 包含方括号。

我试着用这种方式修改我的regex。IF\[((?!IF))\] 最后 IF\[(.+(?!IF))\]. 我加了一个前瞻,说 "保留不包含另一个IF的IF"。现在它在情况1和3中工作,但情况2返回整个字符串。

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

我已经尝试过这个答案中的解决方案。https:/stackoverflow.coma327479605731129

regex regex-negation regex-look-ahead
1个回答
1
投票

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

为此,您可以使用

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

搜索引擎演示

详细内容

  • IF\[ - 一个 IF[ 子串
  • ([^][]*(?:(?<!\bIF)\[[^][]*][^][]*)*) - 第1组。
    • [^][]* - 0+字符以外的字符 []
    • (?:(?<!\bIF)\[[^][]*][^][]*)* - 0次或更多次出现
      • (?<!\bIF)\[ - a [ 虚词 IF (\b 是字界)。)
      • [^][]* - 0+字符以外的其他字符 []
      • ] - a ] 烧焦
      • [^][]* - 0+字符以外的其他字符 []
  • ] - a ] char.
© www.soinside.com 2019 - 2024. All rights reserved.