首页 > 解决方案 > 匹配特定单词及其后成对括号之间的字符串,支持单个嵌套级别,但有异常

问题描述

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

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 中工作正常,但在案例 1C[0]中包含方括号。

我试图以这种方式更改我的正则表达式:IF\[((?!IF))\]和 finaly IF\[(.+(?!IF))\]。我添加了一个展望,说它“保留不包含另一个 IF 的 IF”。现在它适用于案例 1 和 3,但案例 2 返回整个字符串。

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

我已经在这个答案中尝试了解决方案:https ://stackoverflow.com/a/32747960/5731129

标签: regexregex-negationregex-look-ahead

解决方案


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

为此,您可以使用

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

查看正则表达式演示

细节

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

推荐阅读