需要在我的 perl 正则表达式中转义不平衡的括号
Need to escape unbalanced brackets in my perl regular expression
- 编辑:我在实时正则表达式工具中添加了一个 link 来检查正在运行的正则表达式:https://regex101.com/r/906a6D/4
我有以下 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后面添加了
\
以防止被匹配(像[
和]
一样,\
有特殊含义我们的正则表达式)
- 为转义字符添加了一个分支(
\
后跟任何字符匹配,否则忽略)
- 编辑:我在实时正则表达式工具中添加了一个 link 来检查正在运行的正则表达式:https://regex101.com/r/906a6D/4
我有以下 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后面添加了
\
以防止被匹配(像[
和]
一样,\
有特殊含义我们的正则表达式) - 为转义字符添加了一个分支(
\
后跟任何字符匹配,否则忽略)