【问题标题】:Conditional regular expression with PerlPerl 的条件正则表达式
【发布时间】:2012-12-30 15:32:25
【问题描述】:

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

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

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

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

use strict;
use warnings;

$_ = 'AB';

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

【问题讨论】:

  • 这不太可能是解决您潜在问题的好方法。请解释你要做什么

标签: regex perl


【解决方案1】:

Perl 支持conditional patterns

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

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

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

【讨论】:

  • 您能否提供一个工作示例,此条件如何工作以及什么可能是有效条件?
  • @smith 我们仍然不知道您实际上想要完成什么
  • @melpomene:您链接到的页面有 两个 名为 (?(condition)yes-pattern|no-pattern) 的锚点,至少 Firefox 最初会将我带到您可能没有 意思。最好只链接到perldoc.perl.org/perlre.html#Extended-Patterns
【解决方案2】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    相关资源
    最近更新 更多