0

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

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

到目前为止,我有以下正则表达式,它使用否定的后视来检查并且没有完全缓存]第二场比赛中的最后一个。

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

我的目标是拥有一个简单的解析器,可以用来处理简单的嵌套命令块。

4

1 回答 1

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

于 2012-04-23T18:01:24.117 回答