2012-04-23 151 views
0

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

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

到目前为止,我有以下的正则表达式,它使用负查找屁股检查和倒不缓存中的第二场比赛最后]

(\[)(?:(?!(?:[^\\])\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

+0

谢谢!你帮助我预见了我甚至没有想到的问题。此外,添加创意逻辑(在1奇数之前使用2个偶数+ 1个奇数)非常整齐。 – Xeoncross 2012-04-23 18:12:44