还包括Perl支持条件的正则表达式:条件的正则表达式
(?(condition)true-pattern|false-pattern)
即如果条件真,那么尝试其他符合真正的模式尝试匹配的虚假模式
如果Perl的支持条件正则表达式那么为什么没有这个代码打印1
?
use strict;
use warnings;
$_ = 'AB';
if (/(?(A)B|C)/) {
print 1;
}
还包括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
已被使用,并且如果该匹配项存在于字符串中,则会向前移动匹配项。
The perldoc,如其他答案中所引用的,解释了您可以在条件中使用的其他选项,但是我觉得上面的两个示例是最常用的。
这不太可能是解决您的潜在问题的好方法。请解释你正在尝试做什么 – Borodin