Perl验证正则表达式和循环捕获

时间:2014-02-04 02:04:12

标签: regex perl validation

我需要验证一个像“[one.two.three]”这样的字符串,其中标题用“。”分隔,必须至少有一个标题。需要提取每个标题。有没有办法在循环中执行此操作,还是必须分为两个步骤?

use strict;
use warnings;

my @tests = ("[one]", "[two.three.four]");

foreach (@tests) {
    while ($_ =~ /^\[(\w+)(?:\.\w+)*\]$/) {
        print "$1\n";
    }

    print "\n\n\n";
}

1 个答案:

答案 0 :(得分:2)

是的,将验证和提取分开是有意义的:

my ($titles) = $input =~ /^\[((?:\w+|\b\.\b)+)\]\z/
    or die "invalid input $input.\n";
my @title = split /\./, $titles;

虽然你可以一次完成所有这些,但我认为可读性会受到影响:

my @title = split /\./, ( $input =~ /^\[((?:\w+|\b\.\b)+)\]\z/ )[0] // ''
    or die "invalid input $input.\n";