package main
import (
"regexp"
"fmt"
)
func main() {
var re = regexp.MustCompile(`(?mi)#Modifiers << NOT GOING TO DO THESE HERE.
#∂ Before After Until in?Between
#∂ onwards
#Time-Time << Don't need as both times will match
#Lonely HOURS List: 10,time or 12 <not going to do this
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# - - - - - - - - - - - BIG TIME REGEX - - - - - - - - - - - -
#LONELY HOURS
#These guys are just \d\d. So we identify them through proximity to known times
(?:
#Boundary Lookaround
(?<=[ ]|^|[^\d\.:\r\n$£-])
#hour - you always have hours
(?:1[0-9]|2[0-4]|0?[0-9])
(?:
#Hour [or / to - , and]
#People don't say "12pm or 3?" much. Build it if it comes up.
(?:[ ]? (?:or|[,/-]|to|and) [ ]?)
)
){0,3}
#TIME BASICS:
#Basic times that are definitely times. Have to come last so longer strings match first.
#Boundary Lookaround (BREAK THIS FOR THE LONELY NUMBERS)
# (?<=[ ]|^|[^\d\.:\r\n$£-])
#hour - you always have hours
( (?:1[0-9]|2[0-4]|0?[0-9]) )
#Clarifier. Minutes, AM|PM, a TimeZone or a combination.
(
#Minutes
(?:[ ]?[\:\. ][ ]?) ([0-5][0-9])
#AM|PM
| (?:[ ]?[ap]m|[ ]?o\'?[ ]?clock)
#TimeZones
| (?:[ ]? (?:PS?T|GMT|∆USA|∆US|ET|BST|∆UK
|UK[ ]?[Tt]ime|[Ee]astern[ ]?[Tt]ime|[Pp]acific[ ]?[Tt]ime|[Cc]entral[ ]?[Tt]ime
|∆UTC|ACDT|ACST|ACT|ACT|ADT|AEDT|AEST|AFT|AKDT|AKST|AMST|AMT|AMT|ART|AST|AST|AWDT
|AWST|AZOST|AZT|BDT|BDT|BIOT|BRST|BRT|BST|BST|BST|BTT|CCT|CDT|CDT|CEDT|CEST|CET
|CHADT|CHAST|CHOT|ChST|CHUT|CIST|CIT|CKT|CLST|CLT|COT|CST|CST|CST|CST|CST|CT|CVT
|CWST|CXT|DAVT|DDUT|DFT|EASST|ECT|ECT|EDT|EEDT|EEST|EET|EGST|EGT|EIT|EST|EST|FET
|FJT|FKST|FKST|FKT|FNT|GALT|GAMT|GFT|GILT|GIT|GMT|GST|GST|GYT|HADT|HAEC|HAST|HKT
|HMT|HOVT|HST|IBST|ICT|IDT|IRDT|IRKT|IRST|IST|IST|IST|JST|KGT|KOST|KRAT|KST|LHST
|LHST|LINT|MAGT|MART|MAWT|MDT|MET|MEST|MHT|MIST|MMT|MSK|MST|MST|MST|MUT|MVT|MYT|NCT
|NDT|NFT|NPT|NST|NT|NUT|NZDT|NZST|OMST|ORAT|PDT|PETT|PGT|PHOT|PKT|PMDT|PMST|PONT
|PST|PST|PYST|PYT|RET|ROTT|SAKT|SAMT|SAST|SBT|SCT|SGT|SLST|SRET|SRT|SST|SST|SYOT
|TAHT|THA|TFT|TJT|TKT|TLT|TMT|TOT|TVT|ULAT|USZ1|UYST|UYT|UZT|VET|VLAT|VOLT|VOST
|VUT|WAKT|WAST|WAT|WEDT|WEST|WET|WST|YAKT)\b )
#Now enable the combo. Note ideally we would say "use one of each" e.g., =/10:234210
){1,3}
#Lonely HOURS: List of Military times <Here we have enough info to allow no ":".
|( (?:
#Boundary Lookaround
(?<=[ ]|^|[^\d\.:\r\n$£-])
#Must open with a military time, no "445" must be "0445"
(?:1[0-9]|2[0-4]|0[0-9])
(?:[ ]?[0-5][0-9][ ]?)
#or and
(?:[ ]? (?:or|[,/-]|to|and) [ ]?)
#2-4 military times, including the closing one
){1,3}
#Must also end with a military time
(?:1[0-9]|2[0-4]|0[0-9])
(?:[ ]?[0-5][0-9][ ]?)
)
#Post rationalise the boundary criteria (?:\b|$|,\b)`)
var str = `NEW TIME MATCHING REGEX
*** REGEX 1: LONELY NUMBERS ***
12 or 3pm
4/5CET
5-6pm
2,4,5pm
1,3 or 6pm
OK. 1,2,3 and 5pm are available
12pm or 3pm <Shouldn't match "or"
#Military times
1200 or 1300.
1100,1300 or 1400.
121212121212121212 <don't match
*** REGEX 2: BASICS ***
1
11am or 2pm
12pm
12 CET
12pm CET
12.32pm
14 pm
10.00?
0.15
3 : 34
10 53
00.15
at3.00?
10amis good for me
4 oclock
2o'clock
2 o clock
yes,3 am
12.50 GBP
USD 4.00
£12.50
10.93?
00000
0000-559
00001
00001
00001
01300
01700
from 2 - 6
there is about 3 of them
Not sure, maybe 14 apples?
how about 10 tomorrow? << should fail
10 tomorrow?
about £23.00
10,11 or 12
10, 11 or 2?
10 or 12?
10 or my place?
1030 or 1130
10.30 or 12?
10 and 11 work
10, 11, 12th?
1,000
`
for i, match := range re.FindAllString(str, -1) {
fmt.Println(match, "found at index", i)
}
}
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 Golang, please visit: https://golang.org/pkg/regexp/