Regex for time in hh:mm am/pm format - regex

I need to make strict validation of input for a school project, time in format HH:MM am/pm. So far i've got this RegEx expression:
(([01]?[0-9]):([0-5][0-9]) ([AaPp][Mm]))
here's a working demo: http://regexr.com/3c9b5
The only problem is that it accepts times 13:00 to 19:59
What is the correct regular expresion? RegEx has always been hard for me

You can use:
\b((1[0-2]|0?[1-9]):([0-5][0-9]) ([AaPp][Mm]))
EDIT: ^ changed this from "0" to "1" to not accept 00:00

You can use this:
^([1-9]|0[1-9]|1[0-2]):[0-5][0-9] ([AaPp][Mm])$
It will accept 1:00 am, 01:00 AM, 12:00 PM, 11:00 pm, 12:59 Pm. But won't accept 00:00 am or 00:00 PM or 01:60 Am.

([0-9]|0[0-9]|1[0-9]|2[0-3]):([0-5][0-9])\s*([AaPp][Mm])
For the following:
10:00AM
10:00PM
10:00am
10:00pm
10:00 pm
10:00 am
10:30PM
23:46am

This regex has 3 parts, separated by the OR operator.
Each part allows for a type of HH
They are 0[1-9], [1-9], and 1[0-2].
/(0[1-9]:[0-5][0-9]((\ ){0,1})((AM)|(PM)|(am)|(pm)))|([1-9]:[0-5][0-9]((\ ){0,1})((AM)|(PM)|(am)|(pm)))|(1[0-2]:[0-5][0-9]((\ ){0,1})((AM)|(PM)|(am)|(pm)))/

I used this regex
([0-9]{2})\\/([0-9]{2})\\/([0-9]{4}) ([0-9]{2}):([0-9]{2}):([0-9]{2}) (am|pm)
You can try this. Hope this helps!

String regex = "([01]?[0-9]|2[0-3]):[0-5][0-9]";
This will work for the 24 hours validation

if you are looking for the super solution that matches ALL the time case use this regular expression:
((1[0-9]|0?[1-9])(:([0-5][0-9])) ?([AaPp][Mm])?|(1[0-9]|0?[1-9]) ?([AaPp][Mm]))(\s+([A-Z]{3,5})?|$)
it matches all the following:
simple format: 12:05, 12:04PM, 1pm, 12:05 PM but not 13PM or 28AM
time zones: 12PM MST, 1:00AM MDT or 2pm NZDT
it also doesn't match 45 minute or 12. Try here:
https://regex101.com/r/OU5DM4/1

Related

How to extract time out of text with regex in Google Sheets

I need to get the time values out of this string:
SomeText 02/02/2020 9:00 AM-02/02/2020 9:15 AM;"Text" 02/02/2020 10:45 AM-02/02/2020 11:15 AM;"Text" 02/02/2020 12:45 PM-02/02/2020 1:00 PM;
The pattern and length are not consistent. But time always comes after the date.
Any suggestions?
See if this works
=regexextract(J7, rept("\s(\d+:\d+\s[AP]M).+", len(J7)-len(substitute(J7, ":",))))
Note: to convert the returned values to number, try
=ArrayFormula(regexextract(J7, rept("\s(\d+:\d+\s[AP]M).+", len(J7)-len(substitute(J7, ":",))))+0)
and format the output as desired.
You could use
\d+:\d+ [AP]M
See a demo on regex101.com.

VBA Regex - match entire string unless repeating pattern

I am vexed - and I suspect there is an easy solution to this but after a fair amount of research, I'm reaching out to the community.
I'm using the regex method in vba to try to split strings. What I want to occur is that the entire string will match the pattern unless there is another name in the string. The name can be described by:
"\s?[a-zA-Z-]*,\s[a-zA-Z]*:\s.*"
I would expect that the method would return everything after the name is matched - until another name is matched. This would be the desired outcome.
The strings I'm applying that pattern to are:
Meck, Mary: Fri 6/14/2019 5:00 PM -- 10:00 PM CLERKPETRO Flinstone, Fred: Fri 6/14/2019 10:00 AM -- 4:00 PM CLERKPETRO Powers, Kenny: Fri 6/14/2019 10:00 PM -- 11:00 PM
Rhodes, Randy: Sat 6/15/2019 10:15 AM -- 11:30 AM SERVCNTR Sat 6/15/2019 11:30 AM -- 12:45 PM CLICK AND PICK Sat 6/15/2019 12:45 PM -- 2:15 PM SERVCNTR
When I apply the pattern to either string, the entire string is returned. This is not optimal because I'm trying to split on names using matches(0), matches(1), etc.. so the first string should match on:
Meck, Mary: Fri 6/14/2019 5:00 PM -- 10:00 PM CLERKPETRO
Flinstone, Fred: Fri 6/14/2019 10:00 AM -- 4:00 PM CLERKPETRO
Powers, Kenny: Fri 6/14/2019 10:00 PM -- 11:00 PM
yet the second string should match on the entire string (as it currently does) because there is not a second name in that string.
How do I solve this problem?
This is one way to do it
\b[a-zA-Z-]+,\s?[a-zA-Z]+:.*?(?=\b[a-zA-Z-]+,\s?[a-zA-Z]+:|$)
https://regex101.com/r/ccj6ea/1
Expanded
\b
[a-zA-Z-]+
,
\s?
[a-zA-Z]+
:
.*?
(?=
\b
[a-zA-Z-]+
,
\s?
[a-zA-Z]+
:
|
$
)
RegEx 1
I'm guessing that we wish to capture three parts of the strings listed in the question, which if that might be the case, we would be starting by slightly modifying the original expression:
(?:\s+)?([a-zA-Z-]+),?(?:\s+)?([a-zA-Z]+):(.+?[A-Z]{3,}).*
where our desired outputs are in these three groups:
([a-zA-Z-]+)
([a-zA-Z]+)
(.+?[A-Z]{3,})
Demo
RegEx Circuit
jex.im visualizes regular expressions:
RegEx 2
If we wish to split them on names, we would simplify our expression to:
(?:\s+)?([A-Z][a-zA-Z-]+),?(?:\s+)?([A-Z][a-zA-Z]+):
Demo 2

Regular expression to match time range 00:00:00

I have dabbled with regex before for simple matches, however I think this is out of my league. I am using Google Analytics (GA) and I want to match Session Durations that come in the format of 00:00:00.
I found some articles similar to what I need but it does not match the range:
(^([0-1]?\d|2[0-9]):([0-9]?\d):([0-9]?\d)$)|(^([0-9]?\d):([0-9]?\d)$)|(^[0-9]?\d$)
The problem is I have had many visits that lasted 1 second and some for 1hr in between real visits that lasted say between 10sec and 10mins. Due to the quantity of invalid visits my average is skewed. So I want to add a filter in GA via regex to match times between 00:00:10 and 00:10:00.
You can use
/^[0-9]{2}:[0-9]{2}:[0-9]{2}$/
OR
/^\d{2}:\d{2}:\d{2}$/
if you want to match only from 00:00:00 to 99:99:99
Here '^' specifies start of pattern and '$' specifies end of pattern.
If you don't use them, the pattern will also match '99:99:99:99999', which is not the intended result. So specify them to mention the start and end of the pattern.
If you also wants to match single digit more greater than zero, like 9:9:96 and 01:8:20 etc then use
/^([1-9]{1}|[0-9]{2}):([1-9]{1}|[0-9]{2}):([1-9]{1}|[0-9]{2})$/
This may help... an answer without using groups and easy to maintain:
00:10:00|00:0[1-9]:[0-5][\d]|00:00:[1-5]\d
Works with
00:00:00 ignore
00:00:01 ignore
00:00:10 accept
00:00:11 accept
00:00:59 accept
00:00:60 ignore
00:05:03 accept
00:09:59 accept
00:10:00 accept
00:10:01 ignore
00:10:50 ignore
01:20:00 ignore
it will work with eveyrthing between 10 seconds inclusive to 10 minutes inclusive excluding everything else.
Due to the quantity of invalid visits my average is skewed. So I want
to add a filter in GA via regex to match times between 00:00:10 and
00:10:00.
Interpreting this need, try something like this:
^00:(10:00|0[1-9]:[0-5][0-9]|00:[1-5][0-9])$
which is saying:
The "hours" part must be 00
The "minutes" part can be: EITHER 01 to 09 followed by any second (00 to 59) OR 00 followed by any second between 10 and 59.
The result for a few test values:
00:00:00 NO
00:00:01 NO
00:00:10 YES
00:00:11 YES
00:00:20 YES
00:05:03 YES
00:09:59 YES
00:10:00 YES
00:10:50 NO
01:00:00 NO

Regex- How to exclude words

I'm trying to match and exclude specific words using regex. I'm essentially trying to match all strings in a 24 hour with an option of an am or pm. However I would like to excludes string that begin with 2014 or 2013. For example:
Input:
11 45 pm
12 34 am
1230pm
2013pm
12 pm
12p
2014 pm
Desired output:
11 45 pm
12 34 am
1230pm
12 pm
I would like to only use one regex to match this. I know how to accomplish this task with two regex's.
I'm using the following command:
grep -E '^(?!2014)(?!2013)([01]?[0-9]|2[0-3])( )?[0-5][0-9]?\s?(am|pm)?' output.txt
with no success. Any suggestions? Thanks!
You can use a pattern like:
^((?:0?[0-9]|1[012])\s?(?:[0-5][0-9])?\s?[ap]m)
Here, I've assumed that either am or pm is present at the end of statement.
This works too:
[0-9]{1,2}\s*[0-9]{1,2}(?<!2013)(?<!2014)\s*(am|pm)

Regular expression for matching HH:MM time format

I want a regexp for matching time in HH:MM format. Here's what I have, and it works:
^[0-2][0-3]:[0-5][0-9]$
This matches everything from 00:00 to 23:59.
However, I want to change it so 0:00 and 1:00, etc are also matched as well as 00:00 and 01:30. I.e to make the leftmost digit optional, to match HH:MM as well as H:MM.
Any ideas how to make that change? I need this to work in javascript as well as php.
Your original regular expression has flaws: it wouldn't match 04:00 for example.
This may work better:
^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$
Regular Expressions for Time
HH:MM 12-hour format, optional leading 0
/^(0?[1-9]|1[0-2]):[0-5][0-9]$/
HH:MM 12-hour format, optional leading 0, mandatory meridiems (AM/PM)
/((1[0-2]|0?[1-9]):([0-5][0-9]) ?([AaPp][Mm]))/
HH:MM 24-hour with leading 0
/^(0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$/
HH:MM 24-hour format, optional leading 0
/^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$/
HH:MM:SS 24-hour format with leading 0
/(?:[01]\d|2[0-3]):(?:[0-5]\d):(?:[0-5]\d)/
Reference and Demo
None of the above worked for me.
In the end I used:
^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$ (js engine)
Logic:
The first number (hours) is either:
a number between 0 and 19 --> [0-1]?[0-9] (allowing single digit number)
or
a number between 20 - 23 --> 2[0-3]
the second number (minutes) is always a number between 00 and 59 --> [0-5][0-9] (not allowing a single digit)
You can use this one 24H, seconds are optional
^([0-1]?[0-9]|[2][0-3]):([0-5][0-9])(:[0-5][0-9])?$
The best would be for HH:MM without taking any risk.
^(0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$
Amazingly I found actually all of these don't quite cover it, as they don't work for shorter format midnight of 0:0 and a few don't work for 00:00 either, I used and tested the following:
^([0-9]|0[0-9]|1?[0-9]|2[0-3]):[0-5]?[0-9]$
You can use this regular expression:
^(2[0-3]|[01]?[0-9]):([1-5]{1}[0-9])$
If you want to exclude 00:00, you can use this expression
^(2[0-3]|[01]?[0-9]):(0[1-9]{1}|[1-5]{1}[0-9])$
Second expression is better option because valid time is 00:01 to 00:59 or 0:01 to 23:59. You can use any of these upon your requirement.
Regex101 link
As you asked the left most bit optional, I have done left most and right most bit optional too, check it out
^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]?$
It matches with
0:0
00:00
00:0
0:00
23:59
01:00
00:59
The live link is available here
None of the above answers worked for me, the following one worked.
"[0-9]{2}:[0-9]{2}"
To validate 24h time, use:
^([0-1]?[0-9]|2?[0-3]|[0-9])[:\-\/]([0-5][0-9]|[0-9])$
This accepts:
22:10
2:10
2/1
...
But does not accept:
25:12
12:61
...
Description
hours:minutes with:
Mandatory am|pm or AM|PM
Mandatory leading zero 05:01 instead of 5:1
Hours from 01 up to 12
Hours does not accept 00 as in 00:16 am
Minutes from 00 up to 59
01:16 am ✅
01:16 AM ✅
01:16 ❌ (misses am|pm)
01:16 Am❌ (am must all be either lower or upper case)
1:16 am ❌ (Hours misses leading zero)
00:16 ❌ (Invalid hours value 00)
Regular Expression
To match single occurrence:
^(0[1-9]|1[0-2]):([0-5][0-9]) ((a|p)m|(A|P)M)$
To match multiple occurrences:
Remove ^ $
(0[1-9]|1[0-2]):([0-5][0-9]) ((a|p)m|(A|P)M)
You can use following regex:
^[0-1][0-9]:[0-5][0-9]$|^[2][0-3]:[0-5][0-9]$|^[2][3]:[0][0]$
Declare
private static final String TIME24HOURS_PATTERN = "([01]?[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]";
public boolean validate(final String time) {
pattern = Pattern.compile(TIME24HOURS_PATTERN);
matcher = pattern.matcher(time);
return matcher.matches();
}
This method return "true" when String match with the Regular Expression.
A slight modification to Manish M Demblani's contribution above
handles 4am
(I got rid of the seconds section as I don't need it in my application)
^(([0-1]{0,1}[0-9]( )?(AM|am|aM|Am|PM|pm|pM|Pm))|(([0]?[1-9]|1[0-2])(:|\.)[0-5][0-9]( )?(AM|am|aM|Am|PM|pm|pM|Pm))|(([0]?[0-9]|1[0-9]|2[0-3])(:|\.)[0-5][0-9]))$
handles:
4am
4 am
4:00
4:00am
4:00 pm
4.30 am
etc..
The below regex will help to validate hh:mm format
^([0-1][0-9]|2[0-3]):[0-5][0-9]$
Your code will not work properly as it will not work for 01:00 type formats. You can modify it as follows.
pattern =r"^(0?[1-9]|1[0-2]):[0-5][0-9]$"
Making it less complicated we can use a variable to define our hours limits.Further we can add meridiems for more accurate results.
hours_limit = 12
pattern = r"^[1-hours_limit]:[0-5][0-9]\s?[AaPp][Mm]$"
print(re.search(pattern, "2:59 pm"))
Check this one
/^([0-1]?[0-9]|2[0-3]):([0-5]?[0-9]|5[0-9])$/
Mine is:
^(1?[0-9]|2[0-3]):[0-5][0-9]$
This is much shorter
Got it tested with several example
Match:
00:00
7:43
07:43
19:00
18:23
And doesn't match any invalid instance such as 25:76 etc ...
You can try the following
^\d{1,2}([:.]?\d{1,2})?([ ]?[a|p]m)?$
It can detect the following patterns :
2300
23:00
4 am
4am
4pm
4 pm
04:30pm
04:30 pm
4:30pm
4:30 pm
04.30pm
04.30 pm
4.30pm
4.30 pm
23:59
0000
00:00
check this masterfull timestamp detector regex I built to look for a user-specified timestamp, examples of what it will pickup include, but is most definitely NOT limited to;
8:30-9:40
09:40-09 : 50
09 : 40-09 : 50
09:40 - 09 : 50
08:00to05:00
08 : 00to05 : 00
08:00 to 05:00
8am-09pm
08h00 till 17h00
8pm-5am
08h00,21h00
06pm untill 9am
It'll also pickup many more, as long as the times include digits
Try the following
^([0-2][0-3]:[0-5][0-9])|(0?[0-9]:[0-5][0-9])$
Note: I was assuming the javascript regex engine. If it's different than that please let me know.
You can use following regex :
^[0-2]?[0-3]:[0-5][0-9]$
Only modification I have made is leftmost digit is optional. Rest of the regex is same.