Извлечь числовые значения с помощью регулярных выражений - PullRequest
0 голосов
/ 08 марта 2012

У меня есть имя файла в следующем формате:

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+), чтобы получить числовое значение.Как я могу пропустить первые числовые значения и получить желаемое?

Ответы [ 4 ]

2 голосов
/ 08 марта 2012

Если вы уверены, что дата всегда будет 8-значным числом, то что-то вроде:

my ($date) = ($fileName =~ m/_(\d{8})_/);
2 голосов
/ 08 марта 2012

Если я понимаю ваши потребности, как на счет:

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
2 голосов
/ 08 марта 2012

Если я правильно понимаю вашу потребность, вы можете использовать что-то вроде (\d{8})_(\d{6}), чтобы точно соответствовать нужному количеству цифр, затем вы можете составить результат, используя две группы захвата.

Для вашего примера,это будет соответствовать дважды:

20120301_144327 и 20120301_144395

Если вы хотите сохранить простоту, просто соберите все в одной группе захвата,что-то вроде: (\d{8}_\d{6}) А затем заменить _ на что-то еще (или ничего).

0 голосов
/ 08 марта 2012

Вы можете попробовать мое регулярное выражение, хотя оно получает только 20120301_144327, потому что оно не распознает 144395 в качестве действительного значения времени для ЧЧММСС (и даже в течение секунд после полуночи!)

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...