2013-03-20 16 views
5

Chcę zdefiniować stałą regexp w moim skrypcie u góry i użyć jej później, aby sprawdzić format ciągu daty.Jak zdefiniować wzorzec regexp jako stałą w Perlu?

moja data ciąg zostanie zdefiniowany jako

$ a = "20.03.2013 11: 09: 30,788";

ale się nie udało. jak mam zrobić?

use strict; 
use warnings; 


use constant REGEXP1 => "/^\d{4}\D\d{2}\D\d{2}\D\d{2}\D\d{2}\D\d{2}\D\d{3}$/"; 

$a="2013-03-20 11:09:30.788"; 
if(not $a=~&REGEXP1){ 
     print "not" 

}else{ 
     print "yes" 

} 
print "\n"; 

Odpowiedz

3

Którą wersję Perla używasz? To działa na mnie w 5.8.8 (ale nie 5.004), jeśli go zmienić do tego:

use constant REGEXP1 => qr/^\d{4}\D\d{2}\D\d{2}\D\d{2}\D\d{2}\D\d{2}\D\d{3}$/; 
9

Po pierwsze, spójrzmy na "/^\d{4}\D\d{2}\D\d{2}\D\d{2}\D\d{2}\D\d{2}\D\d{3}$/"; Jeśli miał na ostrzeżenia, należy zdobyć:

Unrecognized escape \d passed through at C:\temp\jj.pl line 7. 
Unrecognized escape \D passed through at C:\temp\jj.pl line 7. 
Unrecognized escape \d passed through at C:\temp\jj.pl line 7. 
…

Jeśli wydrukujesz wartość REGEXP1, otrzymasz /^d{4}Dd{2}Dd{2}Dd{2}Dd{2}Dd{2}Dd{3} (* czekaj, co się stało z $/?). Najwyraźniej nie wygląda to na pożądany wzór.

Teraz można wpisać "/^\\d{4}\\D\\d{2}\\D\\d{2}\\D\\d{2}\\D\\d{2}\\D\\d{2}\\D\\d{3}\$/", a następnie wstawić ten ciąg do wzorca, ale to za dużo pracy. Zamiast tego można zdefiniować stałą pomocą regexp quote operator, qr:

#!/usr/bin/env perl 

use 5.012; 
use strict; 
use warnings; 

use constant REGEXP1 => qr/^\d{4}\D\d{2}\D\d{2}\D\d{2}\D\d{2}\D\d{2}\D\d{3}$/; 

my $s = "2013-03-20 11:09:30.788"; 

say $s =~ REGEXP1 ? 'yes' : 'no'; 

Jest jeszcze jedna haczyka: \d i \D dopasuje więcej niż tylko [0-9] i [^0-9] odpowiednio. Zamiast tego możesz napisać swój wzór:

use constant REGEXP1 => qr{ 
    \A 
    (?<year> [0-9]{4}) - 
    (?<month> [0-9]{2}) - 
    (?<day> [0-9]{2}) [ ] 
    (?<hour> [0-9]{2}) : 
    (?<min> [0-9]{2}) : 
    (?<sec> [0-9]{2}) [.] 
    (?<msec> [0-9]{3}) 
    \z 
}x; 

Ale nadal pozostaje pytanie, czy wartości te są znaczące. Jeśli to ma znaczenie, możesz użyć DateTime::Format::Strptime.

#!/usr/bin/env perl 

use 5.012; 
use strict; 
use warnings; 

use DateTime::Format::Strptime; 

my $s = "2013-03-20 11:09:30.788"; 

my $strp = DateTime::Format::Strptime->new(
    pattern => '%Y-%m-%d %H:%M:%S.%3N', 
    on_error => 'croak', 
); 

my $dt = $strp->parse_datetime($s); 
say $strp->format_datetime($dt); 
+0

Co oznacza "\ d" i "\ D" poza '[0-9]'? – RickF

+1

Zobacz "Cyfry" w [perldoc perlrecharclass] (http://perldoc.perl.org/perlrecharclass.html). * Oznacza to, że jeśli modyfikator '/ a' nie działa,' \ d' odpowiada nie tylko cyfrom "0" - "9", ale także arabskim, dewanagaryjskim i cyfrom z innych języków. Może to powodować pewne zamieszanie i pewne problemy z bezpieczeństwem. * –

Powiązane problemy