【问题标题】:Need to escape unbalanced brackets in my perl regular expression需要在我的 perl 正则表达式中转义不平衡的括号
【发布时间】:2018-04-29 00:57:43
【问题描述】:

我有以下 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 \[ ]    

被完全忽略,完全不匹配,甚至没有一个字符。

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

【问题讨论】:

    标签: regex perl regex-lookarounds parentheses brackets


    【解决方案1】:

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

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

    变化:

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

    【讨论】:

    • @W.Flores 您删除了内部所有格量词。这给了我不好的感觉。
    • 已更改以反映您的原始答案(使用两个 + 符号而不是一个)。但是,这超出了我的知识范围,我只是选择了更贪婪的那个。这怎么可能是坏事?
    • 是的,这看起来很不错 :) 涵盖了我的案例,甚至更多!谢谢。我将把它作为公认的解决方案,因为它符合我的要求。 (\[(?>[^\[\]\\]++|\\.|(?1))*+\])
    • 它应该匹配,因为重要的是 [ ] 内的内容被捕获。这可以匹配。事实上,这个想法不是“避免”匹配,而是不考虑转义括号来做平衡。所以[\\] 没问题。 [a \\ ] 应该匹配整个事物,如 [a \[ ]。这两种解决方案都有效,除了涉及[\\] 的特殊情况外,我并没有特别提到[\\],但我确实很高兴有两个正则表达式进行比较,因为我可以想到一个用例具体用途:)
    • @melpomene 只是为了让您放心 :) 内部所有格量词没有任何作用,因为由于外部组的原子性质,不会发生回溯。由于组量词的所有格性质,这也是多余的。因此,您可以放心使用(\[ (?: [^\[\]\\]+ | \\. | (?1) )*+ \] )
    猜你喜欢
    • 2011-12-19
    • 1970-01-01
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    • 2010-10-07
    相关资源
    最近更新 更多