【问题标题】:Assign captured group to value, and if no match: assign string将捕获的组分配给值,如果不匹配:分配字符串
【发布时间】:2016-02-25 09:55:17
【问题描述】:

在 Perl 正则表达式中,the documentation 表示

... 在标量上下文中,$time =~ /(\d\d):(\d\d):(\d\d)/ 返回 true 或假值。然而,在列表上下文中,它返回的列表 匹配值($1,$2,$3)

但是,当您提供替代选项时 - 当没有找到匹配项时 - 即使在列表上下文中也会分配 TRUE 或 FALSE?

例如,我想将匹配的组分配给一个变量,如果没有找到,使用字符串值 ALL。

my ($var) = $string =~ /myregex/ || 'ALL';

这可能吗?那么多个捕获的组呢?例如

my ($var1, $var2) = $string =~ /(d.t)[^d]+(d.t)/ || 'dit', 'dat';

如果第一个组不匹配,则使用'dit',如果没有找到第二个匹配,则使用'dat'

【问题讨论】:

  • 必须是单排吗? if else 并使用 $1$2 可能更具可读性
  • @Recct 没必要——只要它是有效的。
  • 同样在||之后,如果左边的所有内容都是错误的,那么即使你使用较弱的or,假设在正则表达式失败时应用仍然没有任何事情发生在右边.

标签: regex perl capturing-group


【解决方案1】:

对于第一个需求,可以使用三元运算符:

my $string = 'abded';
for my $f ('a' .. 'f') {
    my ($v1) = $string =~ /($f)/ ? ($1) : ('ALL') ;
    say "$f : $v1";
}

输出:

a : a
b : b
c : ALL
d : d
e : e
f : ALL

【讨论】:

    猜你喜欢
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 2010-10-09
    相关资源
    最近更新 更多