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

时间:2012-04-23 17:41:34

标签: regex recursion lexer

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

zero [ one [ two ] three [ four \[ five \] ] six ] seven

到目前为止,我有以下正则表达式,它使用负面后卫进行检查,并且不会在第二场比赛中缓存最后]

(\[)(?:(?!(?:[^\\])\1|\]).)*]

我的目标是使用一个简单的解析器来处理简单的嵌套命令块。

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

http://www.rubular.com/r/BhQzLQpyB9