in reply to duration regex

Update: Pleeaase don't vote++ for this! Having looked at Enlils and Abigails solutions, I realise that this is so over-specified and complicated that it is effectively garbage!

The only saving grace is that I didn't post my first attempt. That was really complicated!

I think this does the trick, though a few more testcases wouldn't go amiss.

(Quickly) updated to correct my misreading of the spec. Date::Manip allows mixed negatives and positives in it's deltas, and I assumed this did too!

#! perl -slw use strict; my $re_dur_years = qr[ (?<= P ) \d+ Y ]x; my $re_dur_months = qr[ (?<= [PY] ) \d+ M ]x; my $re_dur_days = qr[ (?<= [PYM] ) \d+ D ]x; my $re_dur_hours = qr[ (?<= [T] ) \d+ H ]x; my $re_dur_minutes = qr[ (?<= [TH] ) \d+ M ]x; my $re_dur_seconds = qr[ (?<= [THM] ) \d+ (?: \. \d+ )? S ]x; my $re_dur = qr[^ -? P (?= T? -? \d+ ) (?: $re_dur_years? | $re_dur_months? | $re_dur_days? (?: T (?: | $re_dur_hours | $re_dur_minutes | $re_dur_seconds ){1,3} )? ){1,6} $]x; while( <DATA> ) { chomp; print and next if m[^\s*$]; printf "%s %s\n", $_, $_=~ $re_dur ? 'matched' : 'didn\'t match'; } __DATA__ P P1Y P1Y1M P1Y1M1D P1Y1M1DT1H P1Y1M1DT1H1M P1Y1M1DT1H1M1S P1Y1M1DT1H1M1.1S P1M1DT1H1M1.1S P1DT1H1M1.1S PT1H1M1.1S PT1M1.1S PT1.1S PT0.1S P- P-1Y P-1Y-1M P-1Y-1M-1D P-1Y-1M-1DT-1H P-1Y-1M-1DT-1H-1M P-1Y-1M-1DT-1H-1M-1S P-1Y-1M-1DT-1H-1M-1.1S P-1M-1DT-1H-1M-1.1S P-1DT-1H-1M-1.1S PT-1H-1M-1.1S PT-1M-1.1S PT-1.1S PT-0.1S P1H P1M1Y P1D1M P1DT1M PT1Y PT1M PT1D PT1S1M PT1M1H -P1Y P3Y3M3DT3H3M3S P3M3Y3DT3H3M3S P334Y3DT3H3M3S PT2H 5T PT P5M6DT P5M6DT9 P600T6S

Results

P:\test>297188 P didn't match P1Y matched P1Y1M matched P1Y1M1D matched P1Y1M1DT1H matched P1Y1M1DT1H1M matched P1Y1M1DT1H1M1S matched P1Y1M1DT1H1M1.1S matched P1M1DT1H1M1.1S matched P1DT1H1M1.1S matched PT1H1M1.1S matched PT1M1.1S matched PT1.1S matched PT0.1S matched -P didn't match -P1Y matched -P1Y1M matched -P1Y1M1D matched -P1Y1M1DT1H matched -P1Y1M1DT1H1M matched -P1Y1M1DT1H1M1S matched -P1Y1M1DT1H1M1.1S matched -P1M1DT1H1M1.1S matched -P1DT1H1M1.1S matched -PT1H1M1.1S matched -PT1M1.1S matched -PT1.1S matched -PT0.1S matched P1H didn't match P1M1Y didn't match P1D1M didn't match P1DT1M matched PT1Y didn't match PT1M matched PT1D didn't match PT1S1M didn't match PT1M1H didn't match -P1Y matched P3Y3M3DT3H3M3S matched P3M3Y3DT3H3M3S didn't match P334Y3DT3H3M3S matched PT2H matched 5T didn't match PT didn't match P5M6DT matched P5M6DT9 didn't match P600T6S didn't match

Examine what is said, not who speaks.
"Efficiency is intelligent laziness." -David Dunham
"Think for yourself!" - Abigail

Edited by castaway: closed bold and em tags on update line.