首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Perl的条件正则表达式

使用Perl的条件正则表达式
EN

Stack Overflow用户
提问于 2012-12-30 23:32:26
回答 2查看 5.4K关注 0票数 2

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

代码语言:javascript
复制
(?(condition)true-pattern|false-pattern)

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

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

代码语言:javascript
复制
use strict;
use warnings;

$_ = 'AB';

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

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-30 23:40:56

Perl支持conditional patterns

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

代码语言:javascript
复制
Unknown switch condition (?(A) in regex; marked by <-- HERE in m/(?( <-- HERE A)B|C)/

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

票数 6
EN

Stack Overflow用户

发布于 2013-05-21 04:31:15

我知道我来晚了,但我会试着解释我对当前正则表达式正在做什么以及如何调整它的理解。

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

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

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14091965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档