您的正则表达式基本上没问题,只是它在目标字符串中的任何位置查找模式。这意味着任何包含单个有效时间的字符串都将匹配。您必须添加字符串锚点的开头和结尾,^
并$
强制整个字符串与模式匹配。
如果您首先编写一个公共子表达式,然后像子例程一样使用它,您会发现编写正则表达式更清晰、更容易。它还有助于使用/x
修饰符,以便您可以使用空格更清晰地布置表达式。
例如,这匹配单个时间字符串
/ ( [0-1][0-9] | 2[0-3] ) [0-5][0-9] /x
你可以继续在主表达式中替换它两次。
(?: ... )
除非您真的想将子字符串捕获到$1
等中,否则最好使用非捕获括号$2
。
看看这个程序,看看你的想法
use strict;
use warnings;
my $time = qr/(?: (?: [0-1][0-9] | 2[0-3] ) [0-5][0-9] ) /x;
while (<DATA>) {
print if /^ $time (?: ,[ \t]* $time )* $/x;
}
__DATA__
1245
0056, 1034,2355
1235, 4711
0000,1111
输出
1245
0056, 1034,2355
0000,1111