使用正则表达式提取数值

时间:2012-03-08 13:19:01

标签: perl

我有以下格式的文件名:

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

我想从中提取日期,在本例中为2012030114432720120301144395

我一直在使用(\d+)来获取数值。如何跳过第一个数字值并获得所需数值?

4 个答案:

答案 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;