Parse String to get "date", "time" and "other", with Regexp - javascript

In Google Apps Script, I am trying to parse a string with regexp. My string looks something like this:
The first part is text only but of varying length and then follows a date (dd.mm.yyyy) and a starting time (on the European 24h scale) and an ending time (also on the European 24h scale), i.e.:
Event in Cologne dd.mm.yyyy 18:30 - 23:00
What i would like to do is parse this string with regexp in Google Apps Script in four parts and save those as new variables:
title,
date,
start time &
end time
Can anyone here help me with this?

It may help you to experiment with your regexp. If you search for "regexp tester" you'll find many available options. For example, on #gskinner's RegExr.com there is a wealth of resources; tutorials, examples, a full cheat sheet, etc. But best, a live "lab" to try them out.
So there's an example that will match the date portion of your source string. The event title comes before that, the time after... so even without a full matching regexp you should be easily able to break it down.
/([\d]+\.[\d]+\.[\d]+)/g matches date in MM.DD.YYYY or DD.MM.YYYY format (demo)
/((([0-1]?[0-9])|([2][0-3])):)([0-5][0-9])/g matches time (demo)

Related

How to Add "Z" at the end of date string with moment in javascript and nodejs

I want to format my date such that the "Z" letter appears at the end of the date.
I've tried many things but nothing seems to be working. i need it to be in the format of "YYYY-MM-DDT00:00:00.000Z" right now it is in this format except for the Z
How can I include the Z at the end using moment, note that i need the date at the start of the day, as in everything after the "T" is 0.
My Code:
console.log(moment(req.body.to, "YYYY-MM-DD").startOf('day'))
'from': {$eq: moment(req.body.from, "YYYY-MM-DD").startOf('day')},
output of the log:
(moment("2022-10-09T00:00:00.000"))
Taking from the docs you could do:
moment(req.body.to, "YYYY-MM-DD").startOfDay().format("YYYY-MM-DD[T]HH:mm:ss.SSS[Z]")
Escaping characters
To escape characters in format strings, you can wrap the characters in square brackets.
Or, since you only want zeroes:
moment(req.body.to, "YYYY-MM-DD").format("YYYY-MM-DD[T00:00:00.000Z]")
Or, since your example indicates that your date is already in YYYY-MM-DD format, why not just do:
`${req.body.to}T00:00:00.000Z`

datetime Regular Expressions pattern to match yyyy-MM-dd hh:mm:ss format

Im trying to create regex pattern in javascript to validate datetime format yyyy-MM-dd hh:mm:ss
/([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9]) ([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(([\-\+]([0-1][0-9])\:00))/
here is an example on jsfiddle
but its not working when i test it against this date time 2017-08-31 01:22:34
can anybody help me to know whats wrong in my pattern
Thank you
It's because the pattern currently requires, rather than makes optional, the timezone modifier, which isn't present in the example date you gave.
Change the last part to:
( ([\-\+]([0-1][0-9])\:00))?
Also:
your hours sub-group is matching 0-59 rather than 0-23.
you're escaping a number of things you don't need to, e.g. : and -
the pattern allows for invalid dates e.g. 39 as a day.
Revision:
/^([0-2][0-9]{3})\-(0[1-9]|1[0-2])\-([0-2][0-9]|3[0-1]) ([0-1][0-9]|2[0-3]):([0-5][0-9])\:([0-5][0-9])( ([\-\+]([0-1][0-9])\:00))?$/
Note this will not account for invlaid dates in certain months e.g. 30th February. That means either making the pattern more complicated or using something better suited than REGEX for date validation.
It's because of the last part which should be optional (([\-\+]([0-1][0-9])\:00))?
Here is a demo
var a = /([0-2][0-9]{3})-([0-1][0-9])-([0-3][0-9]) ([0-5][0-9]):([0-5][0-9]):([0-5][0-9])(([\-\+]([0-1][0-9])\:00))?/;
console.log('2017-08-31 01:22:34'.match(a))
BTW, you don't have to escape :. - should be escaped only when used inside brackets []
In java, we can use like below and also you can take this pattern for javascript
private static Pattern DATE_PATTERN = Pattern.compile(".*?\[0-9\]{4}-(0\[1-9\]|1\[0-2\])-(0\[1-9\]|\[1-2\]\[0-9\]|3\[0-1\]) (2\[0-3\]|\[01\]\[0-9\]):\[0-5\]\[0-9\]:\[0-5\]\[0-9\]");
public void test() {
if(!DATE_PATTERN.matcher(line.trim()).matches()) {
//code here
}
}
If you want to check only date then remove *? from the pattern

RegEx to split formatting string in JavaScript

I am using a JS date library which has a simple asString() formatting syntax e.g. dd mmm yyyy produces 01 Jan 1970.
Unfortunately should the month happen to contain a letter that appears in the formatting string it can go wrong, e.g. `Date('2014-09-01').asString('dd mmm yyyy') = 01 Septe9ber 2014'
To solve this is quite simple; alter the asString() method to use the format '[dd] [mmm] [yyyy]' instead. However this comes from a global format string used by other methods. The only method that needs the square brackets is the asString method.
So my ideal solution is to simply add a function in that method which replaces any of the following strings within the format string:
formats=['yyyy','yy','mmmm','mmm','mm','m','dddd','ddd','dd','d','hh','min','ss'];
With itself surrounded by []
dd/mm/yyyy => [dd]/[mm]/[yyyy]
Unfortunately the RegEx is proving to be complex - simply looping through each item results in [[d][d]]/[[m][m]]/[[yy][yy]].
So I'd like help writing this RegEx. If it can't be done please say so - I'm not interested in using new libraries as a solution but would consider solutions which solved the problem in a different way within the current asString method (i.e. no breaking changes)
This should do:
var regex = /(min|y+|m+|d+|h+|s+)/g,
newString = format.replace(regex,'[$1]');
Tested with the format "dd/mm/yyyy", resulted in "[dd]/[mm]/[yyyy]"

Are problems in achieving find the separator location in javascript

I have a question.
I was wondering how I can find the separator location.
Or have the date in the format DD / MM / YYYY without having to force the slash.
Any suggestions?
Thanks
You can use indexOf or lastIndexOf to find your seperator locations. If it's just a matter of formatting the date then take a look at some of the date libraries available out there.
Here are just a few:
moments.js
dates.js
xdate.js
there are many more, just G* search "javascript date library"
I was wondering if there is any function or method that I return the system date in the format:
10/12/2012 or 12/10/2012 or last 10:12:2012
but not manually enter the slash, colon or dash.

Regular expression in javascript to check time with date

I need to check whether the text contains a date part with it.
for ex: mytext_12/26/2011_11:51_AM or someText_12/26/2011_13:51_PM have a date part it returns true.
I am not too good with expressions so looking for one. the format of the date - time part is fixed.
i got a way out for it but failing for time .
var containsDate = ~str.search(/\d{1,2}\/\d{1,2}\/\d{4}/);
it checks the date part perfectly but when i am trying for the time part i am messing it up some where .
_\d{1,2}:\d{2}_(?:AM|PM) this is the part for time but i am not able to generate the final regex by combining this two.
Try,
.search(/[0-9]{2}\/[0-9]{2}\/[0-9]{4}_[0-9]{2}:[0-9]{2}_(AM|PM)/)
A good resource for regex,
MDN:Regular Expressions
Try,
.search(/\d+\/\d+\/\d{4}_\d+:\d+_(AM|PM)/)

Categories