#include <StringConstants.au3> ; to declare the Constants of StringRegExp
#include <Array.au3> ; UDF needed for _ArrayDisplay and _ArrayConcatenate
Local $sRegex = "(?m)^(?!-00:00)(?=^(?:Z|[\+\-](?:0[0-9]|1[012]):00|\+0[34569]:30|\+10:30|-03:30|-09:30|\+13:00|\+14:00|\+05:45|\+08:45|\+12:45))^((Z)|([\+\-])(\d\d):(\d\d))$"
Local $sString = "// Time Zone UTC Offsets in actual use for ISO 8601 / RFC 3339 (Museum of Bad Data)" & @CRLF & _
"" & @CRLF & _
"// Accept: UTC indicator" & @CRLF & _
"Z" & @CRLF & _
"// Accept: Valid +xx:00" & @CRLF & _
"+00:00" & @CRLF & _
"+01:00" & @CRLF & _
"+02:00" & @CRLF & _
"+03:00" & @CRLF & _
"+04:00" & @CRLF & _
"+05:00" & @CRLF & _
"+06:00" & @CRLF & _
"+07:00" & @CRLF & _
"+08:00" & @CRLF & _
"+09:00" & @CRLF & _
"+10:00" & @CRLF & _
"+11:00" & @CRLF & _
"+12:00" & @CRLF & _
"+13:00" & @CRLF & _
"+14:00" & @CRLF & _
"// Accept: Valid -xx:00" & @CRLF & _
"-01:00" & @CRLF & _
"-02:00" & @CRLF & _
"-03:00" & @CRLF & _
"-04:00" & @CRLF & _
"-05:00" & @CRLF & _
"-06:00" & @CRLF & _
"-07:00" & @CRLF & _
"-08:00" & @CRLF & _
"-09:00" & @CRLF & _
"-10:00" & @CRLF & _
"-11:00" & @CRLF & _
"-12:00" & @CRLF & _
"" & @CRLF & _
"// Accept: Valid +xx:30" & @CRLF & _
"+03:30" & @CRLF & _
"+04:30" & @CRLF & _
"+05:30" & @CRLF & _
"+06:30" & @CRLF & _
"+09:30" & @CRLF & _
"+10:30" & @CRLF & _
"" & @CRLF & _
"// Accept: Valid +xx:45" & @CRLF & _
"+05:45" & @CRLF & _
"+08:45" & @CRLF & _
"+12:45" & @CRLF & _
"" & @CRLF & _
"// Accept: Valid -xx:30" & @CRLF & _
"-03:30" & @CRLF & _
"-09:30" & @CRLF & _
"" & @CRLF & _
"// Accept: Valid: 30 offsets" & @CRLF & _
"" & @CRLF & _
"+03:30" & @CRLF & _
"+04:30" & @CRLF & _
"+05:30" & @CRLF & _
"+06:30" & @CRLF & _
"+09:30" & @CRLF & _
"+10:30" & @CRLF & _
"-03:30" & @CRLF & _
"-09:30" & @CRLF & _
"" & @CRLF & _
"// Accept: Valid :45 offsets" & @CRLF & _
"+05:45" & @CRLF & _
"+08:45" & @CRLF & _
"+12:45" & @CRLF & _
"" & @CRLF & _
"// Reject: valid RFC 3339, invalid ISO 8601" & @CRLF & _
"" & @CRLF & _
"-00:00" & @CRLF & _
"" & @CRLF & _
"// Reject: no such UTC offset in use" & @CRLF & _
"-13:00" & @CRLF & _
"-14:00" & @CRLF & _
"+00:01" & @CRLF & _
"+00:03" & @CRLF & _
"+00:99" & @CRLF & _
"+20:00" & @CRLF & _
"+0:00" & @CRLF & _
"// Reject: no such UTC offset in use" & @CRLF & _
"" & @CRLF & _
"+01:30" & @CRLF & _
"+07:30" & @CRLF & _
"+08:30" & @CRLF & _
"+02:30" & @CRLF & _
"+11:30" & @CRLF & _
"+12:30" & @CRLF & _
"+13:30" & @CRLF & _
"+14:30" & @CRLF & _
"-01:30" & @CRLF & _
"-02:30" & @CRLF & _
"-04:30" & @CRLF & _
"-05:30" & @CRLF & _
"-06:30" & @CRLF & _
"-07:30" & @CRLF & _
"-08:30" & @CRLF & _
"-10:30" & @CRLF & _
"-11:30" & @CRLF & _
"-12:30" & @CRLF & _
"-13:30" & @CRLF & _
"-14:30" & @CRLF & _
"" & @CRLF & _
"// Reject: Unused :45 offsets" & @CRLF & _
"+01:45" & @CRLF & _
"+02:45" & @CRLF & _
"+03:45" & @CRLF & _
"+04:45" & @CRLF & _
"+06:45" & @CRLF & _
"+07:45" & @CRLF & _
"+09:45" & @CRLF & _
"+10:45" & @CRLF & _
"+11:45" & @CRLF & _
"+13:45" & @CRLF & _
"+14:45" & @CRLF & _
"-01:45" & @CRLF & _
"-02:45" & @CRLF & _
"-03:45" & @CRLF & _
"-04:45" & @CRLF & _
"-05:45" & @CRLF & _
"-06:45" & @CRLF & _
"-07:45" & @CRLF & _
"-08:45" & @CRLF & _
"-09:45" & @CRLF & _
"-10:45" & @CRLF & _
"-11:45" & @CRLF & _
"-12:45" & @CRLF & _
"-13:45" & @CRLF & _
"-14:45" & @CRLF & _
"" & @CRLF & _
"+01:15" & @CRLF & _
"+02:15" & @CRLF & _
"+03:15" & @CRLF & _
"+04:15" & @CRLF & _
"+05:15" & @CRLF & _
"+06:15" & @CRLF & _
"+07:15" & @CRLF & _
"+08:15" & @CRLF & _
"+09:15" & @CRLF & _
"+10:15" & @CRLF & _
"+11:15" & @CRLF & _
"+12:15" & @CRLF & _
"+13:15" & @CRLF & _
"+14:15" & @CRLF & _
"-01:15" & @CRLF & _
"-02:15" & @CRLF & _
"-03:15" & @CRLF & _
"-04:15" & @CRLF & _
"-05:15" & @CRLF & _
"-06:15" & @CRLF & _
"-07:15" & @CRLF & _
"-08:15" & @CRLF & _
"-09:15" & @CRLF & _
"-10:15" & @CRLF & _
"-11:15" & @CRLF & _
"-12:15" & @CRLF & _
"-13:15" & @CRLF & _
"-14:15" & @CRLF & _
"" & @CRLF & _
"// Reject: Z stands alone" & @CRLF & _
"Z00:00" & @CRLF & _
"Z00" & @CRLF & _
"Z0" & @CRLF & _
"// Reject: hyphen required" & @CRLF & _
"0100" & @CRLF & _
"+0100" & @CRLF & _
"-0100" & @CRLF & _
"// Reject: colon required" & @CRLF & _
"+0100" & @CRLF & _
"// Reject: No extra characters" & @CRLF & _
"2001-02-03T04:05:06.007+0800" & @CRLF & _
"+08:00 " & @CRLF & _
" +08:00" & @CRLF & _
"```" & @CRLF & _
"" & @CRLF & _
"### Expanded Pattern:" & @CRLF & _
"" & @CRLF & _
"```" & @CRLF & _
"^(?!-00:00)(?=^(?:Z|[\+\-](?:0[0-9]|1[012]):00|\+0[34569]:30|\+10:30|-03:30|-09:30|\+13:00|\+14:00|\+05:45|\+08:45|\+12:45))^((Z)|([\+\-])(\d\d):(\d\d))$" & @CRLF & _
"```" & @CRLF & _
"" & @CRLF & _
"```" & @CRLF & _
"^ # use zero-width assertions to capture all the special cases:" & @CRLF & _
"(?!-00:00) # not -00:00" & @CRLF & _
"(?=^(?:" & @CRLF & _
" Z # Z alone works," & @CRLF & _
" |[\+\-](?:0[0-9]|1[012]):00 # and all other +/- xx:00s," & @CRLF & _
" |\+0[34569]:30|\+10:30|-03:30|-09:30 # the +/- xx:30s." & @CRLF & _
" |\+13:00|\+14:00|\+05:45|\+08:45|\+12:45 # and these special cases" & @CRLF & _
")) # Now that we've forced only positive matches, let's capture the pieces:" & @CRLF & _
"^( # G1: the whole offset" & @CRLF & _
" (Z) | # G2: UTC indicator or nil" & @CRLF & _
" ([\+\-]) # G3: +/- direction" & @CRLF & _
" (\d\d) # G4: "hours" part of offset" & @CRLF & _
" :" & @CRLF & _
" (\d\d) # G5: "minutes" part of offset" & @CRLF & _
")$" & @CRLF & _
"```" & @CRLF & _
""
Local $aArray = StringRegExp($sString, $sRegex, $STR_REGEXPARRAYGLOBALFULLMATCH)
Local $aFullArray[0]
For $i = 0 To UBound($aArray) -1
_ArrayConcatenate($aFullArray, $aArray[$i])
Next
$aArray = $aFullArray
; Present the entire match result
_ArrayDisplay($aArray, "Result")
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for AutoIt, please visit: https://www.autoitscript.com/autoit3/docs/functions/StringRegExp.htm