Regex 在Perl中匹配并保存字符串中的一个或多个匹配项
我有一个hh:mm:ss格式的字符串,其中包含一次或多次。我创建这个正则表达式是为了尝试通过分组来保存时间,以便我可以做一些工作: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 }
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匹配?并提供样本数据和用于操作时间的代码。