2016-11-28 60 views
1

我需要提取括号之间的表达式,其中可以包含所有内容但不包含非转义的闭括号。排除范围内的转义字符

例如,来自[aaa\]bbbbbb]的正则表达式应给出结果:aaa\]bbbbbb

我试过这个:\[([^(?<!\\)\]]*)\]但是失败了。

任何提示?

+0

太棒了,谢谢!我会花一些时间来理解工具页面的解释:) – sssimon

回答

1

您可以使用

\[([^\]\[\\]*(?:\\.[^\]\[\\]*)*)] 

或者 - 如果有可能是任何非转义[在两者之间非转义[](如[a[\[aa\]bbbbbba\[aabbbbbb]),取出\[

\[([^\]\\]*(?:\\.[^\]\\]*)*)] 

查看regex demo 1regex demo 2。它是\[((?:[^][\\]|\\.)*)]正则表达式的unrolled variant

详细

  • \[ - 一个[
  • ([^\]\[\\]*(?:\\.[^\]\[\\]*)*) - 第1个捕获:
    • [^\]\[\\]* - 零个或多个字符比[]\其他(在一些正则表达式的口味,你可以写出它没有逃脱 - [^][\\]*
    • 0 -个
    • (?:\\.[^\]\[\\]*)*的零个或更多序列:
      • \\. - 任何转义序列(\和比换行符字符以外的任何字符
      • [^\]\[\\]* - 比[零个或多个字符其他,]\
  • ] - 闭幕]
+0

你的正则表达式不会对''[a [\ [aa \] bbbbbba \ [aabbbbbb]'(括号内的另一个开口支架)' – Aserre

+0

@Aserre :当然,因为非转义的['和']'不平衡。没有提到OP中这些场景的行为应该是什么。 –

+0

'我需要提取括号之间的表达式,可以包含所有内容但不包含非转义的闭括号。:) :) – Aserre

0

这是(我认为)的工作原理最简单的正则表达式:

\[(.*?)(?<!\\)\] 

其捕获括号中的文字为组1

live demo