Regex 使用正则表达式解析嵌套匹配

Regex 使用正则表达式解析嵌套匹配,regex,recursion,lexer,Regex,Recursion,Lexer,我想在字符串中查找适合起始和结束分隔符的最小序列(考虑转义字符)。例如,如果我有以下字符串,我希望找到最低匹配项[two]和[four\[five\]],而忽略它们包含在[one…three…six]中的匹配项 zero [ one [ two ] three [ four \[ five \] ] six ] seven 到目前为止,我有下面的正则表达式,它使用负的look behinds进行检查,并且没有完全缓存第二个匹配中的最后一个] (\[)(?:(?!(?:[^\\])\1|\]).

我想在字符串中查找适合起始和结束分隔符的最小序列(考虑转义字符)。例如,如果我有以下字符串,我希望找到最低匹配项
[two]
[four\[five\]]
,而忽略它们包含在
[one…three…six]
中的匹配项

zero [ one [ two ] three [ four \[ five \] ] six ] seven
到目前为止,我有下面的正则表达式,它使用负的look behinds进行检查,并且没有完全缓存第二个匹配中的最后一个
]

(\[)(?:(?!(?:[^\\])\1|\]).)*]
我的目标是使用一个简单的解析器来处理简单的嵌套命令块。

以下工作:

\[(?:\\[\[\]]|[^\[\]])*]
看到它工作了吗

说明:

\[                # opening bracket
(?:               # start of non-capturing group (repeat zero or more times)
   \\[\[\]]         # backslash followed by [ or ]
   |                # OR
   [^\[\]]          # any character except [ or ]
)*                # end of non-capturing group
]                 # closing bracket
请注意,这并不十分安全,因为在像
[one\\[two]three]
这样的字符串中,反斜杠是转义的,因此
[
前面的反斜杠不应转义

要解决此问题,可以使用以下方法:

\[(?:(?<!\\)(?:\\\\)*\\[\[\]]|[^\[\]])*]

谢谢!你帮我预见了我甚至没有想到的问题。此外,添加创造性逻辑(在1奇数之前使用2偶数+1奇数)也非常巧妙。
(?<!\\)           # fail if previous character is a backslash
(?:\\\\)*         # some even number of backslashes
\\                # one more backslash to make it odd