我想使用regex在字符串中查找适合起始和结束分隔符的最小序列(考虑转义字符)。例如,如果我有以下字符串,我希望找到最低匹配[ two ]
和[ four \[ five \] ]
,同时忽略它们包含在[ one ... three ... six]
中的匹配。
zero [ one [ two ] three [ four \[ five \] ] six ] seven
到目前为止,我有以下正则表达式,它使用负面后卫进行检查,并且不会在第二场比赛中缓存最后]
。
(\[)(?:(?!(?:[^\\])\1|\]).)*]
我的目标是使用一个简单的解析器来处理简单的嵌套命令块。
答案 0 :(得分:1)
以下作品:
\[(?:\\[\[\]]|[^\[\]])*]
看到它正常工作:http://www.rubular.com/r/cAajtm2wxw
说明:
\[ # 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 ]
之类的字符串中,反斜杠会被转义,因此[
之前的反斜杠不应该转义它。
要解决此问题,您可以使用以下内容:
\[(?:(?<!\\)(?:\\\\)*\\[\[\]]|[^\[\]])*]
这会将原始正则表达式中的单个转义反斜杠\\
更改为以下正则表达式,以检查奇数个反斜杠:
(?<!\\) # fail if previous character is a backslash
(?:\\\\)* # some even number of backslashes
\\ # one more backslash to make it odd