(?x) # Turns on free spacing mode for easier readability # Year start ^(? (?[~?%]{0,2}) Y? (? [+-]? # optional sign (?: \d+E\d+ # exponential form, no 'X' allowed |[0-9UX]* # decimal form, 'X' allowed ) ) (?>S # Literal S letter. It is for the significant digit indicator (?\d+) )? (?\)?[~%?]{0,2}) ) # Year end (?>- # Literal - (hyphen) # Month start (? (?[~?%]{0,2}) (?\(+)? (?(?>1[0-9UX]|[0UX][0-9UX]|[0-9][0-9])) (?>\^(?[\P{L}\P{N}\P{M}:.-]+))? (?[~?%]{0,2}) ) # Month end (?>- # Begin Day Literal - (hyphen) # Day start (? (?[~?%]{0,2}) (?\(+)? (? (?>[012UX][0-9UX]|3[01UX]) ) ) (?[~?%]{0,2}) (?[)~%?]*) # Day end # Time Start # (?>T # Literal T (?2[0-3]|[01][0-9]): (?[0-5][0-9]): (?[0-5][0-9]) (?> (?Z)| (?[+-]) (?[01][0-9]) (?>: #optional minute (?[0-5][0-9]) )? # end optional minute )? # end optional timezone )? # end time )? # END Day literal hypen )?$ # Others end #