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