Perl 是否支持条件正则表达式:
(?(condition)true-pattern|false-pattern)
即如果条件为真,则尝试匹配真模式,否则尝试匹配假模式
如果 Perl 支持条件正则表达式,那为什么这段代码不打印1
呢?
use strict;
use warnings;
$_ = 'AB';
if ( /(?(A)B|C)/ ) {
print 1;
}
Perl 支持conditional patterns
.
您的正则表达式不仅不匹配,还会引发以下语法错误:
Unknown switch condition (?(A) in regex; marked by <-- HERE in m/(?( <-- HERE A)B|C)/
那是因为A
不是有效条件。
我知道我迟到了这个问题,但我会尝试解释我对当前正则表达式正在做什么以及如何调整它的理解。
是的,Perl 支持条件表达式。然而,这个正则表达式的问题在于条件必须是后向引用或零宽度断言,如后视或前瞻。换句话说,条件永远不会消耗字符串中的任何字符。
因此,让我们看一下可以重写的几种方法。
一种方法是使用前瞻并将匹配添加到then
表达式中。所以可以重写为/(?(?=A)AB|C)/
. 这表示如果字符串匹配A
,则匹配并使用,AB
否则匹配并使用C
。这将成功匹配AB
或C
。
另一种方法是在这样的条件之前使用捕获组/(A)?(?(1)B|C)/
。这表示匹配并消耗A
零次或一次;如果捕获组1
有匹配项,则匹配并消费,B
否则匹配并消费C
。这也将成功匹配上一个示例AB
或C
相同,因为A
如果匹配项存在于字符串中,则会消耗并向前移动匹配项。
另一个答案中引用的 perldoc解释了您可以在条件中使用的其他选项,但我认为上面的两个示例将是最常用的。