Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在Perl中匹配并保存字符串中的一个或多个匹配项_Regex_Perl - Fatal编程技术网

Regex 在Perl中匹配并保存字符串中的一个或多个匹配项

Regex 在Perl中匹配并保存字符串中的一个或多个匹配项,regex,perl,Regex,Perl,我有一个hh:mm:ss格式的字符串,其中包含一次或多次。我创建这个正则表达式是为了尝试通过分组来保存时间,以便我可以做一些工作: if ( $s =~ /(.*)(\d{2}:\d{2}:\d{2})(.*)(\d{2}:\d{2}:\d{2})(.*)(\d{2}:\d{2}:\d{2})(.*)/ ) { my @t = ( $2, $5, $8 ); # loop through times and do stuff } else { # no match found }

我有一个hh:mm:ss格式的字符串,其中包含一次或多次。我创建这个正则表达式是为了尝试通过分组来保存时间,以便我可以做一些工作:

if ( $s =~ /(.*)(\d{2}:\d{2}:\d{2})(.*)(\d{2}:\d{2}:\d{2})(.*)(\d{2}:\d{2}:\d{2})(.*)/ )
{
  my @t = ( $2, $5, $8 );
  # loop through times and do stuff
}
else
{
  # no match found
}
问题是字符串可能有一个、两个或三个嵌入时间,而这个正则表达式似乎只有在三个时间都存在时才起作用(不是一个或两个)。有没有更好的方法来做到这一点(并避免任何“使用未初始化值”警告!)

我试过这个,但它只抓住了最后一次:

/(.*)(\d{2}:\d{2}:\d{2})(.*)(\d{2}:\d{2}:\d{2})?(.*)(\d{2}:\d{2}:\d{2})?(.*)/ 
匹配以重复模式。避免使用backref变量,如果您要做的只是将它们立即分配给某个名称更好的变量;match运算符已返回捕获缓冲区结果

use Data::Dumper qw(Dumper);
my $timestamp = qr'
    (?<!\d)            # avoid digits before
    \d{2}:\d{2}:\d{2}  # hh:mm:ss
    (?!\d)             # avoid digits after
'x;

for my $s (qw(
    foo18:00:00bar18:00:00baz18:00:00quux
    foo18:00:00bar18:00:00baz
    foo18:00:00bar
)) {
    if (my @t = $s =~ /($timestamp)/g) {
        print Dumper \@t;
    }
}
使用数据::转储程序qw(转储程序);
我的$timestamp=qr'

(?为什么(.*)…如果您不想捕获,可以使用非捕获组(?:*),或者更好的是,只使用。*此外,尽管它不能解决您的问题,但您应该使用。*?使非贪婪的
\d
匹配大约100个不同的字符。您可能需要
[0-9]
替代或使用
/a
。此外,您可能希望添加一些后向/前向条件以消除误报。例如,
(?因此它将不匹配1234:56:7890。这比我之前的操作要干净得多,谢谢,我唯一的问题是一旦我操纵了时间,如何用新的时间$t更新原始字符串$s[0..$#t]?是否有方法使用分组从正则表达式中反向引用hh:mm:ss匹配?并提供样本数据和用于操作时间的代码。