File Coverage

blib/lib/Time/Str/Regexp.pm
Criterion Covered Total %
statement 12 12 100.0
branch 1 2 50.0
condition n/a
subroutine 5 5 100.0
pod 1 1 100.0
total 19 20 95.0


line stmt bran cond sub pod time code
1             package Time::Str::Regexp;
2 25     25   111631 use strict;
  25         41  
  25         848  
3 25     25   106 use warnings;
  25         41  
  25         1302  
4 25     25   344 use v5.10.1;
  25         98  
5              
6             our $VERSION = '0.80';
7             our @EXPORT_OK = qw[ $ANSIC_Rx
8             $ASN1GT_Rx
9             $ASN1UT_Rx
10             $CLF_Rx
11             $DateTime_Rx
12             $ECMAScript_Rx
13             $GitDate_Rx
14             $ISO8601_Rx
15             $ISO9075_Rx
16             $RFC2616_Rx
17             $RFC2822_Rx
18             $RFC2822FWS_Rx
19             $RFC3339_Rx
20             $RFC3501_Rx
21             $RFC4287_Rx
22             $RFC5280_Rx
23             $RFC5545_Rx
24             $RFC9557_Rx
25             $RubyDate_Rx
26             $UnixDate_Rx
27             $UnixStamp_Rx
28             $W3CDTF_Rx ];
29              
30 25     25   134 use Exporter qw[import];
  25         49  
  25         113905  
31              
32             # DateTime
33             #
34             # Parses a broad set of real-world date and time formats, accepting only
35             # those that can be parsed deterministically. Numeric-only dates must use
36             # Y-M-D order with separators. Any other ordering requires the month to
37             # be given as a name or Roman numeral. Every date must include a four-digit
38             # year. Optional time components include hours, minutes, seconds, fractional
39             # seconds, AM/PM, and time zones. Parsing is structurally deterministic;
40             # semantic validation occurs after matching.
41             #
42             # ISO 8601 - Date and time format:
43             # 2012-12-24
44             # 2012-12-24T15:30
45             # 2012-12-24T15:30+01
46             # 2012-12-24T15:30:45,500+01
47             #
48             # RFC 3339 - Internet timestamps:
49             # 2012-12-24T15:30:45+01:00
50             # 2012-12-24T15:30:45.500+01:00
51             #
52             # RFC 9557 - Timestamps with additional information:
53             # 2012-12-24T15:30:45.500+01:00[Europe/Stockholm]
54             #
55             # RFC 2822 - Internet Message Format:
56             # Mon, 24 Dec 2012 15:30:45 +0100
57             # Mon, 24 Dec 2012 15:30 +0100
58             # 24 Dec 2012 15:30:45 +0100
59             # 24 Dec 2012 15:30 +0100
60             #
61             # RFC 2616 - HTTP-date:
62             # Mon, 24 Dec 2012 15:30:45 GMT
63             #
64             # RFC 9051 - IMAP date-time:
65             # 24-Dec-2012 15:30:45 +0100
66             #
67             # ISO 9075 - SQL timestamp w/ and w/o zone:
68             # 2012-12-24 15:30:45
69             # 2012-12-24 15:30:45 +01:00
70             # 2012-12-24 15:30:45.500
71             # 2012-12-24 15:30:45.500 +01:00
72             #
73             # ECMAScript Date.prototype.toString:
74             # Mon Dec 24 2012 15:30:45 GMT+0100 (Central European Time)
75             #
76             # Long-form Textual:
77             # Monday, 24 December 2012, 15:30 GMT+1
78             # Monday, 24th December 2012 at 3:30 pm UTC+1 (CET)
79             # Monday, December 24, 2012, 3:30 PM
80             # December 24th, 2012 at 3:30 PM
81             #
82             # Short-form Variations:
83             # Dec/24/2012 03:30:45 PM
84             # 24. XII. 2012 12PM UTC+1 (CET)
85             # 24DEC2012 12:30:45.500 UTC+1
86             # 24.Dec.2012 15:30:45
87             #
88             our $DateTime_Rx = qr{
89             (?(DEFINE)
90             (? (?i: Mon|Tue|Tues|Wed|Thu|Thurs|Fri|Sat|Sun))
91             (? (?i: Monday|Tuesday|Wednesday|Thursday|Friday|
92             Saturday|Sunday))
93             (? (?&DayNameShort) | (?&DayNameLong))
94             (? (?i: Jan|Feb|Mar|Apr|May|Jun|Jul|
95             Aug|Sep|Sept|Oct|Nov|Dec))
96             (? (?i: January|February|March|April|May|June|
97             July|August|September|October|November|December))
98             (? (?&MonthNameShort) | (?&MonthNameLong))
99             (? (?i: I|II|III|IV|V|VI|VII|VIII|IX|X|XI|XII))
100             (? (?&MonthName) | (?&MonthRoman))
101             (? (?i: st|nd|rd|th))
102             (? (?: [AaPp] (?: [Mm] | [.][Mm][.])))
103             (? (?: [+-] (?: [0-9]{4} | [0-9]{2} (?: [:][0-9]{2})? )))
104             (? (?: [+-] (?: [0-9]{4} | [0-9]{1,2} (?: [:][0-9]{2})? )))
105             (? [A-Z][A-Za-z][A-Z]{1,4})
106             )
107              
108             \A
109              
110             (?: (? (?&DayName)) [.]?[,]? [ ] )?
111              
112             (?:
113             (?:
114             (? [0-9]{4})
115             ([-./]) (? (?&MonthName) | [0-9]{1,2})
116             \g{-2} (? [0-9]{1,2})
117             |
118             (? [0-9]{1,2})
119             ([-./]) (? (?&MonthTextual))
120             \g{-2} (? [0-9]{4})
121             |
122             (? (?&MonthName))
123             ([-./]) (? [0-9]{1,2})
124             \g{-2} (? [0-9]{4})
125             )
126             |
127             (?:
128             (? [0-9]{1,2} (?&OrdinalSuffix)?) [.]?
129             [ ] (? (?&MonthTextual)) [.,]?
130             [ ] (? [0-9]{4})
131             |
132             (? (?&MonthName)) [.,]?
133             [ ] (? [0-9]{1,2} (?&OrdinalSuffix)?) [,]?
134             [ ] (? [0-9]{4})
135             )
136             |
137             (?:
138             (? [0-9]{4}) (? (?&MonthName)) (? [0-9]{1,2})
139             | (? [0-9]{1,2}) (? (?&MonthTextual)) (? [0-9]{4})
140             )
141             )
142              
143             (?:
144              
145             (?: (?: [ ] (?: [Aa][Tt][ ] )? ) | (?: [,][ ]) | [Tt] )
146              
147             # Note: Dot-separated times (HH.MM or HH.MM.SS) are not accepted; only HH:MM
148             # or HH:MM:SS are allowed. This avoids ambiguity where ISO 8601 decimal hours
149             # could be misinterpreted as hour-minute notation.
150              
151             (?:
152             (? [0-9]{1,2})
153             [:] (? [0-9]{2}) (?: [:] (? [0-9]{2})
154             (?: [.,] (? [0-9]{1,9}) )?)?
155              
156             (?: [ ]? (? (?&Meridiem)) )?
157             |
158             (? [0-9]{1,2})
159             [ ]? (? (?&Meridiem))
160             )
161              
162             (?:
163              
164             [ ]?
165              
166             (?:
167             (? (?&TimeZoneOffset))
168             | (? (?:GMT|UTC)) (?: (? (?&TimeZoneOffsetUTC)) )?
169             | (? [Zz])
170             | (? (?&TimeZoneAbbrev))
171             )
172              
173             # RFC 9557 (IXDTF) annotation tag, e.g. [Europe/Paris]
174             (?:
175             (? (?: \[ [^\[\]]+ \] )+ )
176             )?
177              
178             # Parenthesized comment, e.g. (Central European Time)
179             (?:
180             [ ] (?: \( [^()]+ \) )
181             )?
182              
183             )?
184             )?
185              
186             \z
187             }x;
188              
189             # ITU-T X.680 (ISO/IEC 8824-1) Abstract Syntax Notation One (ASN.1)
190             #
191             #
192             #
193             # ASN.1 GeneralizedTime
194             # YYYYMMDDhh[mm[ss]][(.|,)fraction][Z|±hh[mm]]
195             #
196             our $ASN1GT_Rx = qr{
197             \A
198              
199             (? [0-9]{4})
200             (? [0-9]{2})
201             (? [0-9]{2})
202             (? [0-9]{2}) (?: (? [0-9]{2})
203             (?: (? [0-9]{2}))?)?
204              
205             (?: [.,] (? [0-9]{1,9}))?
206              
207             (?:
208             (? [+-][0-9]{2} (?: [0-9]{2})? )
209             | (? [Z])
210             )?
211             \z
212             }x;
213              
214             # ASN.1 UTCTime
215             # YYMMDDhhmm[ss](Z|±hhmm)
216             #
217             our $ASN1UT_Rx = qr{
218             \A
219              
220             (? [0-9]{2})
221             (? [0-9]{2})
222             (? [0-9]{2})
223             (? [0-9]{2})
224             (? [0-9]{2}) (?: (? [0-9]{2}))?
225             (?:
226             (? [+-][0-9]{4})
227             | (? [Z])
228             )
229             \z
230             }x;
231              
232             # W3 Consortium Date and Time Formats
233             #
234             #
235             # YYYY
236             # YYYY-MM
237             # YYYY-MM-DD
238             # YYYY-MM-DDThh:mm:ss[.fraction](Z|±hh:mm)
239             #
240             our $W3CDTF_Rx = qr{
241             \A
242              
243             (? [0-9]{4})
244              
245             (?: [-] (? [0-9]{2})
246             (?: [-] (? [0-9]{2})
247             (?: [T] (? [0-9]{2})
248             [:] (? [0-9]{2})
249             [:] (? [0-9]{2}) (?: [.] (? [0-9]{1,9}) )?
250             (?:
251             (? [+-][0-9]{2}[:][0-9]{2})
252             | (? [Z])
253             )
254             )?)?)?
255             \z
256             }x;
257              
258             # RFC 2616 Hypertext Transfer Protocol (HTTP/1.1)
259             #
260             #
261             #
262             # DDD, DD MMM YYYY hh:mm:ss GMT # IMF-fixdate
263             # DDDD, DD-MMM-YY hh:mm:ss GMT # RFC 850
264             # DDD MMM (_D|DD) hh:mm:ss YYYY # ANSI C's ctime
265             #
266             our $RFC2616_Rx = qr{
267             (?(DEFINE)
268             (? (?: Mon|Tue|Wed|Thu|Fri|Sat|Sun))
269             (? (?: Monday|Tuesday|Wednesday|Thursday|Friday|
270             Saturday|Sunday))
271             (? (?: Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))
272             )
273             \A
274             (?:
275             # IMF-fixdate
276             (?:
277             (? (?&DayNameShort)) [,]
278             [ ] (? [0-9]{2})
279             [ ] (? (?&MonthNameShort))
280             [ ] (? [0-9]{4})
281             [ ] (? [0-9]{2})
282             [:] (? [0-9]{2})
283             [:] (? [0-9]{2})
284             [ ] (? GMT)
285             )
286             | # RFC 850
287             (?:
288             (? (?&DayNameLong)) [,]
289             [ ] (? [0-9]{2})
290             [-] (? (?&MonthNameShort))
291             [-] (? [0-9]{2})
292             [ ] (? [0-9]{2})
293             [:] (? [0-9]{2})
294             [:] (? [0-9]{2})
295             [ ] (? GMT)
296             )
297             | # ANSI C's ctime
298             (?:
299             (? (?&DayNameShort))
300             [ ] (? (?&MonthNameShort))
301             (?:
302             (?: [ ]{2} (? [0-9]{1}))
303             | (?: [ ]{1} (? [0-9]{2}))
304             )
305             [ ] (? [0-9]{2})
306             [:] (? [0-9]{2})
307             [:] (? [0-9]{2})
308             [ ] (? [0-9]{4})
309             )
310             )
311             \z
312             }x;
313              
314             # RFC 2822 Internet Message Format (canonical)
315             #
316             #
317             #
318             # [DDD,] D MMM YYYY hh:mm[:ss] (±hhmm|UT|UTC|GMT|ZONE) [(comment)]
319             #
320             our $RFC2822_Rx = qr{
321             (?(DEFINE)
322             (? (?i: Mon|Tue|Wed|Thu|Fri|Sat|Sun))
323             (? (?i: Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))
324             (? [A-Z][A-Za-z][A-Z]{1,4})
325             )
326             \A
327             (?: (? (?&DayName))[,][ ] )?
328             (? [0-9]{1,2})
329             [ ] (? (?&MonthName))
330             [ ] (? [0-9]{4})
331             [ ] (? [0-9]{2})
332             [:] (? [0-9]{2}) (?: [:](? [0-9]{2}))?
333             [ ]
334             (?:
335             (? [+-][0-9]{4})
336             | (? UT[C]?|GMT)
337             | (? (?&TimeZoneAbbrev))
338             )
339             (?: [ ] \( [^()]+ \) )?
340             \z
341             }x;
342              
343             # RFC 2822 Internet Message Format (with folding white space and nested comments)
344             #
345             # [DDD,] D MMM YYYY hh:mm[:ss] (±hhmm|UT|UTC|GMT|ZONE) [(comment)]
346             #
347             our $RFC2822FWS_Rx = qr{
348             (?(DEFINE)
349             (? (?i: Mon|Tue|Wed|Thu|Fri|Sat|Sun))
350             (? (?i: Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))
351             (? [A-Z][A-Za-z][A-Z]{1,4})
352             (? \( (?: \\\( | \\\) | [^()] | (?&NestedComment) )* \) )
353             )
354             \A
355             (?: \s* (? (?&DayName))[,] )?
356             \s* (? [0-9]{1,2})
357             \s+ (? (?&MonthName))
358             \s+ (? [0-9]{4})
359             \s+ (? [0-9]{2})
360             [:] (? [0-9]{2}) (?: [:](? [0-9]{2}))?
361             \s+
362             (?:
363             (? [+-][0-9]{4})
364             | (? UT[C]?|GMT)
365             | (? (?&TimeZoneAbbrev))
366             )
367             (?: \s+ (?&NestedComment) )?
368             \z
369             }x;
370              
371             # RFC 3501 Internet Message Access Protocol (IMAP)
372             #
373             #
374             #
375             # DD-MMM-YYYY hh:mm:ss ±hhmm
376             #
377             our $RFC3501_Rx = qr{
378             (?(DEFINE)
379             (? (?i: Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))
380             )
381             \A
382             (? [0-9]{2})
383             [-] (? (?&MonthName))
384             [-] (? [0-9]{4})
385             [ ] (? [0-9]{2})
386             [:] (? [0-9]{2})
387             [:] (? [0-9]{2})
388             [ ] (? [+-][0-9]{4})
389             \z
390             }x;
391              
392             # RFC 3339 Date and Time on the Internet: Timestamps
393             #
394             #
395             # YYYY-MM-DD(T|t|space)hh:mm:ss[.fraction](Z|z|±hh:mm)
396             #
397             our $RFC3339_Rx = qr{
398             \A
399             (? [0-9]{4})
400             [-] (? [0-9]{2})
401             [-] (? [0-9]{2})
402             [Tt ] (? [0-9]{2})
403             [:] (? [0-9]{2})
404             [:] (? [0-9]{2}) (?: [.] (? [0-9]{1,9}) )?
405             (?:
406             (? [+-][0-9]{2}[:][0-9]{2})
407             | (? [Zz])
408             )
409             \z
410             }x;
411              
412             # RFC 9557 Date and Time on the Internet: Timestamps with Additional Information
413             #
414             #
415             # YYYY-MM-DD(T|t|space)hh:mm:ss[.fraction](Z|z|±hh:mm)[TAGS]
416             #
417             our $RFC9557_Rx = qr{
418             (?(DEFINE)
419             (? \[ [0-9A-Za-z!+-._/]+ \])
420             )
421             \A
422             (? [0-9]{4})
423             [-] (? [0-9]{2})
424             [-] (? [0-9]{2})
425             [Tt ] (? [0-9]{2})
426             [:] (? [0-9]{2})
427             [:] (? [0-9]{2}) (?: [.] (? [0-9]{1,9}) )?
428             (?:
429             (? [+-][0-9]{2}[:][0-9]{2})
430             | (? [Zz])
431             )
432             (?:
433             (? (?&Tag)+ )
434             )?
435             \z
436             }x;
437              
438             # RFC 4287 Atom Format
439             #
440             #
441             # YYYY-MM-DDThh:mm:ss[.fraction](Z|±hh:mm)
442             #
443             our $RFC4287_Rx = qr{
444             \A
445             (? [0-9]{4})
446             [-] (? [0-9]{2})
447             [-] (? [0-9]{2})
448             [T] (? [0-9]{2})
449             [:] (? [0-9]{2})
450             [:] (? [0-9]{2}) (?: [.] (? [0-9]{1,9}) )?
451             (?:
452             (? [+-][0-9]{2}[:][0-9]{2})
453             | (? [Z])
454             )
455             \z
456             }x;
457              
458             # RFC 5280 PKIX Certificate and CRL Profile (x509)
459             #
460             #
461             # YYMMDDhhmmzzZ
462             # YYYYMMDDhhmmssZ
463             #
464             our $RFC5280_Rx = qr{
465             \A
466             (? [0-9]{2}|[0-9]{4})
467             (? [0-9]{2})
468             (? [0-9]{2})
469             (? [0-9]{2})
470             (? [0-9]{2})
471             (? [0-9]{2})
472             (? [Z])
473             \z
474             }x;
475              
476             # RFC 5545 iCalendar
477             #
478             #
479             #
480             # YYYYMMDD
481             # YYYYMMDDThhmmss[Z]
482             #
483             our $RFC5545_Rx = qr{
484             \A
485             (? [0-9]{4})
486             (? [0-9]{2})
487             (? [0-9]{2})
488             (?:
489             [T]
490             (? [0-9]{2})
491             (? [0-9]{2})
492             (? [0-9]{2})
493             (? [Z])?
494             )?
495             \z
496             }x;
497              
498             # ISO 8601
499             #
500             #
501             # Calendar date with optional time of day, a profile of ISO 8601.
502             #
503             # YYYY-MM-DD
504             # YYYY-MM-DDThh[:mm[:ss]][(.|,)fraction][Z|±hh[:mm]]
505             # YYYYMMDD
506             # YYYYMMDDThh[mm[ss]][(.|,)fraction][Z|±hh[mm]]
507             #
508             our $ISO8601_Rx = qr{
509             \A
510              
511             (? [0-9]{4})
512              
513             (?: # Extended format
514             (?:
515             [-] (? [0-9]{2})
516             [-] (? [0-9]{2})
517             (?: [T] (? [0-9]{2}) (?: [:] (? [0-9]{2})
518             (?: [:] (? [0-9]{2}))?)?
519              
520             (?: [.,] (? [0-9]{1,9}))?
521              
522             (?:
523             (? [+-][0-9]{2} (?: [:][0-9]{2})? )
524             | (? [Z])
525             )?
526             )?
527             )
528             | # Basic format
529             (?:
530             (? [0-9]{2})
531             (? [0-9]{2})
532             (?: [T] (? [0-9]{2}) (?: (? [0-9]{2})
533             (?: (? [0-9]{2}))?)?
534              
535             (?: [.,] (? [0-9]{1,9}))?
536              
537             (?:
538             (? [+-][0-9]{2} (?: [0-9]{2})? )
539             | (? [Z])
540             )?
541             )?
542             )
543             )
544             \z
545             }x;
546              
547             # ISO 9075 Database Language SQL — Part 2: Foundation (SQL/Foundation)
548             #
549             #
550             # YYYY-MM-DD
551             # YYYY-MM-DD hh:mm:ss[.fraction]
552             # YYYY-MM-DD hh:mm:ss[.fraction] ±hh:mm
553             #
554             our $ISO9075_Rx = qr{
555             \A
556             (? [0-9]{4})
557             [-] (? [0-9]{2})
558             [-] (? [0-9]{2})
559             (?:
560             [ ] (? [0-9]{2})
561             [:] (? [0-9]{2})
562             [:] (? [0-9]{2}) (?: [.] (? [0-9]{1,9}) )?
563             (?:
564             [ ] (? [+-][0-9]{2}[:][0-9]{2})
565             )?
566             )?
567             \z
568             }x;
569              
570             # ECMAScript Date.prototype.toString
571             #
572             #
573             # DDD MMM DD YYYY hh:mm:ss [GMT|UTC]±hhmm [comment]
574             #
575             our $ECMAScript_Rx = qr{
576             (?(DEFINE)
577             (? (?: Mon|Tue|Wed|Thu|Fri|Sat|Sun))
578             (? (?: Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))
579             )
580             \A
581             (? (?&DayName))
582             [ ] (? (?&MonthName))
583             [ ] (? [0-9]{2})
584             [ ] (? [0-9]{4})
585             [ ] (? [0-9]{2})
586             [:] (? [0-9]{2})
587             [:] (? [0-9]{2})
588             [ ] (? UTC|GMT)? (? [+-][0-9]{4})
589             (?:
590             [ ] (?: \( [^()]+ \) )
591             )?
592             \z
593             }x;
594              
595             # Common Log Format
596             #
597             #
598             #
599             # DD/MMM/YYYY:hh:mm:ss[.fraction] ±hhmm
600             #
601             our $CLF_Rx = qr{
602             (?(DEFINE)
603             (? (?: Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))
604             )
605             \A
606             (? [0-9]{2})
607             [/] (? (?&MonthName))
608             [/] (? [0-9]{4})
609             [:] (? [0-9]{2})
610             [:] (? [0-9]{2})
611             [:] (? [0-9]{2}) (?: [.] (? [0-9]{1,9}) )?
612             [ ] (? [+-][0-9]{4})
613             \z
614             }x;
615              
616             # ANSI/ISO C ctime
617             #
618             #
619             #
620             # DDD MMM (_D|DD) hh:mm:ss YYYY
621             #
622             our $ANSIC_Rx = qr{
623             (?(DEFINE)
624             (? (?: Mon|Tue|Wed|Thu|Fri|Sat|Sun))
625             (? (?: Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))
626             )
627             \A
628             (?:
629             (? (?&DayName))
630             [ ] (? (?&MonthName))
631             (?:
632             (?: [ ]{2} (? [0-9]{1}))
633             | (?: [ ]{1} (? [0-9]{2}))
634             )
635             [ ] (? [0-9]{2})
636             [:] (? [0-9]{2})
637             [:] (? [0-9]{2})
638             [ ] (? [0-9]{4})
639             )
640             \z
641             }x;
642              
643             # Git Date
644             #
645             #
646             # The default date format used by Git.
647             #
648             # DDD MMM D hh:mm:ss YYYY ±hhmm
649             #
650             our $GitDate_Rx = qr{
651             (?(DEFINE)
652             (? (?: Mon|Tue|Wed|Thu|Fri|Sat|Sun))
653             (? (?: Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))
654             )
655             \A
656             (? (?&DayName))
657             [ ] (? (?&MonthName))
658             [ ] (? [0-9]{1,2})
659             [ ] (? [0-9]{2})
660             [:] (? [0-9]{2})
661             [:] (? [0-9]{2})
662             [ ] (? [0-9]{4})
663             [ ] (? [+-][0-9]{4})
664             \z
665             }x;
666              
667             # Ruby Date
668             #
669             # Popularized by Ruby on Rails and Twitter.
670             #
671             # DDD MMM DD hh:mm:ss ±hhmm YYYY
672             #
673             our $RubyDate_Rx = qr{
674             (?(DEFINE)
675             (? (?: Mon|Tue|Wed|Thu|Fri|Sat|Sun))
676             (? (?: Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))
677             )
678             \A
679             (? (?&DayName))
680             [ ] (? (?&MonthName))
681             [ ] (? [0-9]{2})
682             [ ] (? [0-9]{2})
683             [:] (? [0-9]{2})
684             [:] (? [0-9]{2})
685             [ ] (? [+-][0-9]{4})
686             [ ] (? [0-9]{4})
687             \z
688             }x;
689              
690             # Unix Date
691             #
692             #
693             # The date command output format.
694             #
695             # DDD MMM (_D|DD) hh:mm:ss (±hhmm|UTC|GMT|ZONE) YYYY
696             # DDD MMM (_D|DD) hh:mm:ss YYYY (±hhmm|UTC|GMT|ZONE)
697             #
698             our $UnixDate_Rx = qr{
699             (?(DEFINE)
700             (? (?: Mon|Tue|Wed|Thu|Fri|Sat|Sun))
701             (? (?: Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))
702             (? [A-Z][A-Za-z][A-Z]{1,4})
703             (? [+-][0-9]{4})
704             )
705             \A
706             (?:
707             (? (?&DayName))
708             [ ] (? (?&MonthName))
709             (?:
710             (?: [ ]{2} (? [0-9]{1}))
711             | (?: [ ]{1} (? [0-9]{2}))
712             )
713             [ ] (? [0-9]{2})
714             [:] (? [0-9]{2})
715             [:] (? [0-9]{2})
716             [ ]
717             (?:
718             (?:
719             (? (?&TimeZoneOffset))
720             | (? UTC|GMT)
721             | (? (?&TimeZoneAbbrev))
722             )
723             [ ] (? [0-9]{4})
724             |
725             (? [0-9]{4})
726             [ ]
727             (?:
728             (? (?&TimeZoneOffset))
729             | (? UTC|GMT)
730             | (? (?&TimeZoneAbbrev))
731             )
732             )
733             )
734             \z
735             }x;
736              
737             # UnixStamp
738             #
739             # Unix date based format with optional fractional seconds and timezone
740             #
741             # [DDD ]MMM (_D|D|DD) hh:mm[:ss[.fraction]] [±hhmm|UTC|GMT|ZONE] YYYY
742             # [DDD ]MMM (_D|D|DD) hh:mm[:ss[.fraction]] YYYY [±hhmm|UTC|GMT|ZONE]
743             #
744             our $UnixStamp_Rx = qr{
745             (?(DEFINE)
746             (? (?: Mon|Tue|Wed|Thu|Fri|Sat|Sun))
747             (? (?: Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))
748             (? [A-Z][A-Za-z][A-Z]{1,4})
749             (? [+-][0-9]{4})
750             )
751             \A
752             (?:
753             (?: (? (?&DayName)) [ ] )?
754             (? (?&MonthName))
755             (?:
756             (?: [ ]{2} (? [0-9]{1}))
757             | (?: [ ]{1} (? [0-9]{1,2}))
758             )
759             [ ] (? [0-9]{2})
760             [:] (? [0-9]{2}) (?: [:] (? [0-9]{2})
761             (?: [.] (? [0-9]{1,9}) )?)?
762             [ ]
763             (?:
764             (?:
765             (? (?&TimeZoneOffset))
766             | (? UTC|GMT) (?: (? (?&TimeZoneOffset)) )?
767             | (? (?&TimeZoneAbbrev))
768             )
769             [ ] (? [0-9]{4})
770             |
771             (? [0-9]{4})
772             (?:
773             [ ]
774             (?:
775             (? (?&TimeZoneOffset))
776             | (? UTC|GMT) (?: (? (?&TimeZoneOffset)) )?
777             | (? (?&TimeZoneAbbrev))
778             )?
779             )?
780             )
781             )
782             \z
783             }x;
784              
785             my %RegexpMap = (
786             ansic => $ANSIC_Rx,
787             asn1gt => $ASN1GT_Rx,
788             asn1ut => $ASN1UT_Rx,
789             clf => $CLF_Rx,
790             datetime => $DateTime_Rx,
791             ecmascript => $ECMAScript_Rx,
792             gitdate => $GitDate_Rx,
793             iso8601 => $ISO8601_Rx,
794             iso9075 => $ISO9075_Rx,
795             rfc2616 => $RFC2616_Rx,
796             rfc2822 => $RFC2822_Rx,
797             rfc2822fws => $RFC2822FWS_Rx,
798             rfc3339 => $RFC3339_Rx,
799             rfc3501 => $RFC3501_Rx,
800             rfc4287 => $RFC4287_Rx,
801             rfc5280 => $RFC5280_Rx,
802             rfc5545 => $RFC5545_Rx,
803             rfc9557 => $RFC9557_Rx,
804             rubydate => $RubyDate_Rx,
805             unixdate => $UnixDate_Rx,
806             unixstamp => $UnixStamp_Rx,
807             w3cdtf => $W3CDTF_Rx,
808             );
809              
810             sub mapping {
811 24 50   24 1 1325 return wantarray ? %RegexpMap : { %RegexpMap };
812             }
813              
814             1;