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

Regex Perl验证正则表达式和循环捕获,regex,perl,validation,Regex,Perl,Validation,我需要验证像“[1.2.3]”这样的字符串,其中标题以“.”分隔,必须至少有一个标题。每个标题都需要提取。有没有办法在一个循环中实现这一点,或者必须是两个独立的步骤 use strict; use warnings; my @tests = ("[one]", "[two.three.four]"); foreach (@tests) { while ($_ =~ /^\[(\w+)(?:\.\w+)*\]$/) { print "$1\n"; }

我需要验证像“[1.2.3]”这样的字符串,其中标题以“.”分隔,必须至少有一个标题。每个标题都需要提取。有没有办法在一个循环中实现这一点,或者必须是两个独立的步骤

use strict;
use warnings;

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

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

    print "\n\n\n";
}

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

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";
完全没有想到split()。所以基本上使用正则表达式来验证格式和允许的字符,然后为每个组分割。