使用Perl的条件正则表达式

时间:2012-12-30 15:32:26

标签: regex perl

Perl是否支持条件正则表达式:

(?(condition)true-pattern|false-pattern)

即。如果条件为真,则尝试匹配真实模式,否则尝试匹配假模式

如果Perl支持条件正则表达式,那么为什么这段代码不能打印1

use strict;
use warnings;

$_ = 'AB';

if ( /(?(A)B|C)/ ) {
  print 1;
}

2 个答案:

答案 0 :(得分:6)

Perl支持conditional patterns

你的正则表达式不仅不匹配,它会引发以下语法错误:

Unknown switch condition (?(A) in regex; marked by <-- HERE in m/(?( <-- HERE A)B|C)/

那是因为A不是有效条件。

答案 1 :(得分:0)

我知道我迟到了这个问题,但我会尝试解释我对当前正则表达式正在做什么以及如何进行调整的理解。

是的,Perl支持条件表达式。但是,这个正则表达式的问题在于条件必须是后引用或零宽度断言,如后视或前瞻。换句话说,条件永远不会消耗字符串中的任何字符。

让我们看看可以重写的几种方法。

一种方法是使用预测并将匹配添加到then表达式。所以它可以改写为/(?(?=A)AB|C)/。这表示如果字符串与A匹配,则匹配并使用AB其他匹配并使用C。然后,这将成功匹配ABC

另一种方法是在条件之前使用捕获组,如/(A)?(?(1)B|C)/。这表示匹配并消耗A零次或一次;如果捕获组1有匹配,则匹配并消耗B其他匹配并消耗C。这也可以成功匹配前一个示例中的ABC,因为消耗了A并且如果字符串中存在匹配则向前移动匹配。

The perldoc,如其他答案所述,解释了您可以在条件中使用的其他选项,但我觉得上面的两个例子是最常用的。