2012-12-30 76 views
0

还包括Perl支持条件的正则表达式:条件的正则表达式

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

即如果条件真,那么尝试其他符合真正的模式尝试匹配的虚假模式

如果Perl的支持条件正则表达式那么为什么没有这个代码打印1

use strict; 
use warnings; 

$_ = 'AB'; 

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

这不太可能是解决您的潜在问题的好方法。请解释你正在尝试做什么 – Borodin

回答

6

Perl支持conditional patterns

你的正则表达式不只是无法比拟的,它抛出以下语法错误:

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

这是因为A是不是一个有效的条件。

+0

你能提供一个工作的例子,说明这个条件是如何工作的以及什么是有效的条件? – smith

+0

@smith你甚至看到我的链接?它列出了所有允许的条件并有其使用的例子。 – melpomene

+1

@smith我们仍然不知道你实际上想要完成什么 –

0

我知道我迟到了这个问题,但我会尽力解释我什么样的电流正则表达式是干什么的理解,以及如何进行调整。

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

因此,让我们看看几个方面,这可以重写。

一种方法是使用一个前瞻和匹配添加到then表达。所以它可以改写为/(?(?=A)AB|C)/。这表示如果字符串匹配A则匹配并消耗AB否则匹配并消耗C。然后这将成功匹配ABC

另一种方式是像这样/(A)?(?(1)B|C)/的条件之前,使用一个捕获组。这表示匹配并消耗零或一次A;如果捕获组1有匹配,则匹配并消耗B否则匹配并消耗C。这也将成功匹配ABC,与前面的示例相同,因为A已被使用,并且如果该匹配项存在于字符串中,则会向前移动匹配项。

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