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