2011-12-14 4 views

ответ

1
my $string = 'Imagetest Test ID 1.2.3 10159 Type MANUAL Designer xyzz (u887) Product WW EEE Date 3/4/2010 Execution Status No Run Status Approved VC Info 1.1.3, CheckedIn'; 
my ($number) = $string =~ m{ 
    (?<= Info \s) # Look behind to check if we found: 'Info ' 
    (
     \d+ # 1 
     \. # . 
     \d+ # 1 
     \. # . 
     \d+ # 3 
    ) 
}x; 

выше регулярное выражение можно упростить следующим образом:

m{ 
    (?<= Info \s) # Look behind to check if we found: 'Info ' 
    (
     (?: 
      \d+ 
      \. 
     ){2} # 1.1. 
     \d+ # 3 
    ) 
}x; 
0

Попробуйте однажды:

^(\d+\.)?(\d+\.)?(\*|\d+)$ 
+0

nope это не работает. \ N значение 1.1.3 является значением VC Info. Я пытаюсь извлечь эту ценность. –

+1

Карет в начале и в конце доллара излишне ограничивает регулярное выражение. Кроме того, захват дает 3 части, а не 1. И непонятно, почему присутствует альтернатива «match-for-*». –

+1

выглядит как случай неправильного повторного использования кода для меня –

1

Прежде всего, 1.1.3 не десятичное число. Это последовательность цифр ASCII, разделенных точками. Просто найдите Info, за которым следует такая последовательность символов.

#!/usr/bin/env perl 

use strict; use warnings; 

my $s = q{Imagetest Test ID 10159 Type MANUAL Designer xyzz (u887) Product 
WW EEE Date 3/4/2010 Execution Status No Run Status Approved VC Info 1.1.3, 
CheckedIn}; 

my $re = qr{ 
    Info 
    \s+ 
    (
     [0-9]+ 
     (?: 
      [.] 
      [0-9]+ 
     )* # use + if a sequence without periods is not possible 
    ) 
}x; 


if (my ($info) = ($s =~ $re)) { 
    print "$info\n"; 
} 
Смежные вопросы