const regex = new RegExp('(\\b(\\b(?:times|some time|any time))\\b|\\b(1[0-9]th)\\b|\\b([2-3]0th)\\b|\\b([2-3]?1st)\\b|\\b(2?2nd)\\b|\\b(2?3rd)\\b|\\b(2?[4-9]th)\\b|\\b((?:(?:1[0-9]|2[0-4]|0?[0-9])(?:(?:[ ]?(?:or|[,/-]|to|and)[ ]?))){0,3}((?:1[0-9]|2[0-4]|0?[0-9]))((?:[ ]?[\\:\\.][ ]?)([0-5][0-9])|(?:[ ]?[ap]m|[ ]?o\\\\'?[ ]?clock)|(?:[ ]?(?: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)){1,3})\\b|\\b(january)\\b|\\b(jan\\b)\\b|\\b(february)\\b|\\b(feb\\b)\\b|\\b(march)\\b|\\b(mar\\b)\\b|\\b(april)\\b|\\b(apr\\b)\\b|\\b(may\\b)\\b|\\b(june)\\b|\\b(jun\\b)\\b|\\b(july)\\b|\\b(jul\\b)\\b|\\b(august)\\b|\\b(aug\\b)\\b|\\b(september)\\b|\\b(sept?)\\b|\\b(october)\\b|\\b(oct\\b)\\b|\\b(november)\\b|\\b(nov\\b)\\b|\\b(december)\\b|\\b(dec\\b)\\b|\\b(\\bnext\\b)\\b|\\b(tomorr?ow (?:afternoon|morning|\\bmorn\\b|evening|\\beve\\b|midd?ay))\\b|\\b(\\bfew\\b)\\b|\\b(\\bafter\\b)\\b|\\b(last (?:not Last [week] of [month|year]))\\b|\\b([Mm]onday)\\b|\\b(year)\\b|\\b(afternoon)\\b|\\b(hours?)\\b|\\b(\\bnoon\\b)\\b|\\b(lunch)\\b|\\b(weekend)\\b|\\b(seconds)\\b|\\b(meeting)\\b|\\b(\\bfirst\\b)\\b|\\b(\\bseveral\\b)\\b|\\b(\\bbefore\\b)\\b|\\b(the other [wee|day|month|year])\\b|\\b([Mm]on\\b)\\b|\\b(month)\\b|\\b(morning)\\b|\\b(minutes?)\\b|\\b(midnight)\\b|\\b(brunch)\\b|\\b(today)\\b|\\b(\\bsecs\\b)\\b|\\b(call)\\b|\\b(\\bsecond\\b)\\b|\\b(\\bcouple\\b)\\b|\\b(\\bbetween\\b)\\b|\\b(^^Regex less opening condition)\\b|\\b([Tt]uesday)\\b|\\b(\\bweek\\b)\\b|\\b(\\bmorn\\b)\\b|\\b(\\bdays\\b)\\b|\\b(midday)\\b|\\b(dinner)\\b|\\b(∆now)\\b|\\b(minutes)\\b|\\b(phone call)\\b|\\b(\\bthird\\b)\\b|\\b(\\bsome\\b)\\b|\\b(in ?-? ?between)\\b|\\b([Tt]ue\\b)\\b|\\b(\\bday\\b)\\b|\\b(evening)\\b|\\b(fou?rtnights)\\b|\\b(breakfast)\\b|\\b(tomorrow)\\b|\\b(\\bmins\\b)\\b|\\b(conference call)\\b|\\b(\\bfourth\\b)\\b|\\b(\\bmany\\b)\\b|\\b([Ww]ednesday)\\b|\\b(fou?rtnight)\\b|\\b(\\beve\\b)\\b|\\b(years)\\b|\\b(\\bmns\\b)\\b|\\b(coffee)\\b|\\b(following)\\b|\\b(\\bin a)\\b|\\b([Ww]eds?)\\b|\\b(days∆)\\b|\\b(midd?ay)\\b|\\b(months)\\b|\\b(hours)\\b|\\b(\\bcoming\\b)\\b|\\b([Tt]hursday)\\b|\\b(weeks)\\b|\\b(\\bhrs\\b)\\b|\\b(\\blast\\b)\\b|\\b([1-9][0-9])\\b|\\b([Tt]hur)\\b|\\b(\\bthis\\b)\\b|\\b([Ff]riday)\\b|\\b([Ff]ri\\b)\\b|\\b([Ss]aturday)\\b|\\b(meet)\\b|\\b([Ss]at\\b)\\b|\\b(phone)\\b|\\b([Ss]unday)\\b|\\b([Ss]un\\b)\\b|\\b(Enhanced Version For Martin. +ve Look Behinds and limited scope for the number of minutes in the secon number. 5,10,15,20,30,45 mins past the hour)\\b|\\b(Enhanced Version For Martin. +ve Look Behinds)\\b|\\b(\\bPS?T\\b)\\b|\\b(\\bGMT\\b)\\b|\\b(\\b∆USA\\b)\\b|\\b(\\b∆US\\b)\\b|\\b(\\bET\\b)\\b|\\b(\\bBST\\b)\\b|\\b(\\b∆UK\\b)\\b|\\b(\\bUK ?[Tt]ime\\b)\\b|\\b(\\b[Ee]astern [Tt]ime\\b)\\b|\\b(\\b[Pp]acific [Tt]ime\\b)\\b|\\b(\\b[Cc]entral [Tt]ime\\b)\\b|\\b(\\bACDT\\b)\\b|\\b(\\bACST\\b)\\b|\\b(\\bACT\\b)\\b|\\b(\\bADT\\b)\\b|\\b(\\bAEDT\\b)\\b|\\b(\\bAEST\\b)\\b|\\b(\\bAFT\\b)\\b|\\b(\\bAKDT\\b)\\b|\\b(\\bAKST\\b)\\b|\\b(\\bAMST\\b)\\b|\\b(\\bAMT\\b)\\b|\\b(\\bART\\b)\\b|\\b(\\bAST\\b)\\b|\\b(\\bAWDT\\b)\\b|\\b(\\bAWST\\b)\\b|\\b(\\bAZOST\\b)\\b|\\b(\\bAZT\\b)\\b|\\b(\\bBDT\\b)\\b|\\b(\\bBIOT\\b)\\b|\\b(\\bBRST\\b)\\b|\\b(\\bBRT\\b)\\b|\\b(\\bBTT\\b)\\b|\\b(\\bCCT\\b)\\b|\\b(\\bCDT\\b)\\b|\\b(\\bCEDT\\b)\\b|\\b(\\bCEST\\b)\\b|\\b(\\bCET\\b)\\b|\\b(\\bCHADT\\b)\\b|\\b(\\bCHAST\\b)\\b|\\b(\\bCHOT\\b)\\b|\\b(\\bChST\\b)\\b|\\b(\\bCHUT\\b)\\b|\\b(\\bCIST\\b)\\b|\\b(\\bCIT\\b)\\b|\\b(\\bCKT\\b)\\b|\\b(\\bCLST\\b)\\b|\\b(\\bCLT\\b)\\b|\\b(\\bCOT\\b)\\b|\\b(\\bCST\\b)\\b|\\b(\\bCT\\b)\\b|\\b(\\bCVT\\b)\\b|\\b(\\bCWST\\b)\\b|\\b(\\bCXT\\b)\\b|\\b(\\bDAVT\\b)\\b|\\b(\\bDDUT\\b)\\b|\\b(\\bDFT\\b)\\b|\\b(\\bEASST\\b)\\b|\\b(\\bECT\\b)\\b|\\b(\\bEDT\\b)\\b|\\b(\\bEEDT\\b)\\b|\\b(\\bEEST\\b)\\b|\\b(\\bEET\\b)\\b|\\b(\\bEGST\\b)\\b|\\b(\\bEGT\\b)\\b|\\b(\\bEIT\\b)\\b|\\b(\\bEST\\b)\\b|\\b(\\bFET\\b)\\b|\\b(\\bFJT\\b)\\b|\\b(\\bFKST\\b)\\b|\\b(\\bFKT\\b)\\b|\\b(\\bFNT\\b)\\b|\\b(\\bGALT\\b)\\b|\\b(\\bGAMT\\b)\\b|\\b(\\bGFT\\b)\\b|\\b(\\bGILT\\b)\\b|\\b(\\bGIT\\b)\\b|\\b(\\bGST\\b)\\b|\\b(\\bGYT\\b)\\b|\\b(\\bHADT\\b)\\b|\\b(\\bHAEC\\b)\\b|\\b(\\bHAST\\b)\\b|\\b(\\bHKT\\b)\\b|\\b(\\bHMT\\b)\\b|\\b(\\bHOVT\\b)\\b|\\b(\\bHST\\b)\\b|\\b(\\bIBST\\b)\\b|\\b(\\bICT\\b)\\b|\\b(\\bIDT\\b)\\b|\\b(\\bIRDT\\b)\\b|\\b(\\bIRKT\\b)\\b|\\b(\\bIRST\\b)\\b|\\b(\\bIST\\b)\\b|\\b(\\bJST\\b)\\b|\\b(\\bKGT\\b)\\b|\\b(\\bKOST\\b)\\b|\\b(\\bKRAT\\b)\\b|\\b(\\bKST\\b)\\b|\\b(\\bLHST\\b)\\b|\\b(\\bLINT\\b)\\b|\\b(\\bMAGT\\b)\\b|\\b(\\bMART\\b)\\b|\\b(\\bMAWT\\b)\\b|\\b(\\bMDT\\b)\\b|\\b(\\bMET\\b)\\b|\\b(\\bMEST\\b)\\b|\\b(\\bMHT\\b)\\b|\\b(\\bMIST\\b)\\b|\\b(\\bMMT\\b)\\b|\\b(\\bMSK\\b)\\b|\\b(\\bMST\\b)\\b|\\b(\\bMUT\\b)\\b|\\b(\\bMVT\\b)\\b|\\b(\\bMYT\\b)\\b|\\b(\\bNCT\\b)\\b|\\b(\\bNDT\\b)\\b|\\b(\\bNFT\\b)\\b|\\b(\\bNPT\\b)\\b|\\b(\\bNST\\b)\\b|\\b(\\bNT\\b)\\b|\\b(\\bNUT\\b)\\b|\\b(\\bNZDT\\b)\\b|\\b(\\bNZST\\b)\\b|\\b(\\bOMST\\b)\\b|\\b(\\bORAT\\b)\\b|\\b(\\bPDT\\b)\\b|\\b(\\bPETT\\b)\\b|\\b(\\bPGT\\b)\\b|\\b(\\bPHOT\\b)\\b|\\b(\\bPKT\\b)\\b|\\b(\\bPMDT\\b)\\b|\\b(\\bPMST\\b)\\b|\\b(\\bPONT\\b)\\b|\\b(\\bPST\\b)\\b|\\b(\\bPYST\\b)\\b|\\b(\\bPYT\\b)\\b|\\b(\\bRET\\b)\\b|\\b(\\bROTT\\b)\\b|\\b(\\bSAKT\\b)\\b|\\b(\\bSAMT\\b)\\b|\\b(\\bSAST\\b)\\b|\\b(\\bSBT\\b)\\b|\\b(\\bSCT\\b)\\b|\\b(\\bSGT\\b)\\b|\\b(\\bSLST\\b)\\b|\\b(\\bSRET\\b)\\b|\\b(\\bSRT\\b)\\b|\\b(\\bSST\\b)\\b|\\b(\\bSYOT\\b)\\b|\\b(\\bTAHT\\b)\\b|\\b(\\bTHA\\b)\\b|\\b(\\bTFT\\b)\\b|\\b(\\bTJT\\b)\\b|\\b(\\bTKT\\b)\\b|\\b(\\bTLT\\b)\\b|\\b(\\bTMT\\b)\\b|\\b(\\bTOT\\b)\\b|\\b(\\bTVT\\b)\\b|\\b(\\bUCT\\b)\\b|\\b(\\bULAT\\b)\\b|\\b(\\bUSZ1\\b)\\b|\\b(\\bUTC\\b)\\b|\\b(\\bUYST\\b)\\b|\\b(\\bUYT\\b)\\b|\\b(\\bUZT\\b)\\b|\\b(\\bVET\\b)\\b|\\b(\\bVLAT\\b)\\b|\\b(\\bVOLT\\b)\\b|\\b(\\bVOST\\b)\\b|\\b(\\bVUT\\b)\\b|\\b(\\bWAKT\\b)\\b|\\b(\\bWAST\\b)\\b|\\b(\\bWAT\\b)\\b|\\b(\\bWEDT\\b)\\b|\\b(\\bWEST\\b)\\b|\\b(\\bWET\\b)\\b|\\b(\\bWST\\b)\\b|\\b(\\bYAKT\\b)\\b|\\b(\\bUK\\b)\\b|\\b(\\bUS\\b)\\b|\\b(\\bPT\\b)\\b|\\b(\\bUK Time\\b)\\b|\\b(\\bUKTime\\b)\\b|\\b(\\bUK time\\b)\\b|\\b(\\bUKtime\\b)\\b|\\b(\\bEastern Time\\b)\\b|\\b(\\bEastern time\\b)\\b|\\b(\\beastern time\\b)\\b|\\b(\\bPacific Time\\b)\\b|\\b(\\bPacific time\\b)\\b|\\b(\\bpacific time\\b)\\b|\\b(\\bCentral Time\\b)\\b|\\b(\\bCentral time\\b)\\b|\\b(\\bcentral time\\b)\\b|\\b(\\bEasternTime\\b)\\b|\\b(\\bEasterntime\\b)\\b|\\b(Spanish time)\\b|\\b(Atlanta time)\\b)', 'gmi')
const 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
`;
// Reset `lastIndex` if this regex is defined globally
// regex.lastIndex = 0;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}
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 JavaScript, please visit: https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions