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);
Co oznacza "\ d" i "\ D" poza '[0-9]'? – RickF
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. * –