需要在我的 perl 正则表达式中转义不平衡的括号

Need to escape unbalanced brackets in my perl regular expression


我有以下 perl 正则表达式

/(\[(?>[^\[\]]+|(?1))*\])/sg

这很好用并且完全匹配所有这些字符串

[a ] 

[ a] 

[a [b
]] 

[code sub t{
   my ($o,$k) = @_;
   my $c = 0;
   my $r;
   for(split //,$t){
     $r .= $_ unless(($c+($k-$o)) % $k);
     []
     $c++
   }
   $r =~ s/[^a-z]//g;
   return $r
 }]

但是,我需要转义括号。如果有不平衡的,这将不起作用,所以我想像这样 \] 或者像这样 {{- ] -}} 来逃避它们。

这应该匹配到最后一个 ] 括号。

[a \] ]        

这也应该匹配到最后一个 ]

[a \]\[ ]      

这也是

[a \ ]        

我也曾尝试在外括号前使用环视断言 (?>!)(?<=) 并在忽略内部括号的情况下使用环视断言

[a \[ ]    

完全忽略,完全不匹配,连一个字符都没有。

我需要在平衡括号时忽略这些转义括号,但仍然匹配正则表达式并被捕获。

这是一个可能的解决方案:

m{ ( \[ (?> [^\[\]\]++ | \. | (?1) )*+ \] ) }xs

更改:

  • 添加了 x 标志以使其更具可读性
  • 使所有量词都具有所有格,因为为什么不呢(否则我会对嵌套的量词感到不安(+ 直接在 * 内))
  • 在第一个字符class后面添加了\以防止被匹配(像[]一样,\有特殊含义我们的正则表达式)
  • 为转义字符添加了一个分支(\ 后跟任何字符匹配,否则忽略)