我有以下格式的文件名:
xx_xx_xx_xx/Run02/isf2sync_output/xx_xx_xx_xx_xx_Run02_xxx3_20120301_144327/xx_xx_xx_xx_xx_Run02_xxx3_20120301_144395.x.x.x.log
我想从中提取日期,在本例中为20120301144327
和20120301144395
。
我一直在使用(\d+)
来获取数值。如何跳过第一个数字值并获得所需数值?
答案 0 :(得分:2)
如果我理解你的需要,你可以使用(\d{8})_(\d{6})
之类的东西来准确匹配你需要的位数,然后你可以使用两个捕获组来组合结果。
对于您的示例,它将匹配两次:
<强> 20120301_144327 强> 和 的 20120301_144395 强>
如果你想保持简单,只需将整个事情放在一个捕获组中,例如:
(\d{8}_\d{6})
然后用其他东西(或什么都没有)替换_。
答案 1 :(得分:2)
如果你确定日期总是一个8位数字,那么就像:
my ($date) = ($fileName =~ m/_(\d{8})_/);
答案 2 :(得分:2)
如果我了解您的需求,那么:
my $str = 'xx_xx_xx_xx/Run02/isf2sync_output/xx_xx_xx_xx_xx_Run02_xxx3_20120301_144327/xx_xx_xx_xx_xx_Run02_xxx3_20120301_144395.x.x.x.log';
my (undef, $second) = $str =~ /\d{8}_\d{6}/g;
say $second;
<强>输出:强>
20120301_144395
答案 3 :(得分:0)
你可以尝试我的正则表达式,虽然它只获得20120301_144327,因为它不能识别144395作为HHMMSS的有效时间值(甚至在午夜之后的秒数!)。
my $re
= qr/ (?: \D | ^ )
( \d{2} \d{2,}? # Y3K? not a problem. Y10K? Not a problem
(?: 0[1-9] | 1[012] )
(?: 0[1-9] | [12]\d | 3[01] )
_
(?: [01]\d | 2[0-3] )
(?: [0-5]\d ){2}
)
(?: \D | $ )
/x;
你甚至可以尝试我更精细(和更愚蠢)的正则表达式:
qr/ (?: \D | ^ )
( \d{2} (?: \d{2,} )?
(?: (?: 0[946] | 11 ) (?: 0[1-9]| [12]\d | 30 )
| (?: 0[13578] | 1[02] ) (?: 0[1-9]| [12]\d | 3[01] )
| 02 (?: 0[1-9]| [12]\d )
)
_
(?: [01]\d | 2[0-3] )
(?: [0-5]\d ){2}
)
(?: \D | $ )
/x;