* Help improve regular expression for 24 hours format @ 2022-11-24 3:36 Jean Louis 2022-11-24 5:50 ` tomas ` (2 more replies) 0 siblings, 3 replies; 12+ messages in thread From: Jean Louis @ 2022-11-24 3:36 UTC (permalink / raw) To: Help GNU Emacs This regular expression shall match 24 hours format such as "12:34". I do not like how I wrote this regular expression, is there way to provide to `rx' function something like "[012]"? Any other way to improve this regular expression by using rx notation that shall match only the 24 hours format such as HH:MM where HH is for hours and MM for minutes? (defvar rcd-rx-time (rx (= 1 (or "00" "01" "02" "03" "04" "05" "06" "07" "08" "09" "10" "11" "12" "13" "14" "15" "16" "17" "18" "19" "20" "21" "22" "23")) ":" (= 1 (any "0" "1" "2" "3" "4" "5")) (= 1 (any digit))) "Regular expression for 24 hours format") (string-match rcd-rx-time "23:00") ⇒ 0 -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: Help improve regular expression for 24 hours format 2022-11-24 3:36 Help improve regular expression for 24 hours format Jean Louis @ 2022-11-24 5:50 ` tomas 2022-11-24 6:32 ` Yuri Khan 2022-11-24 13:09 ` Michael Heerdegen 2 siblings, 0 replies; 12+ messages in thread From: tomas @ 2022-11-24 5:50 UTC (permalink / raw) To: help-gnu-emacs [-- Attachment #1: Type: text/plain, Size: 374 bytes --] On Thu, Nov 24, 2022 at 06:36:34AM +0300, Jean Louis wrote: > > This regular expression shall match 24 hours format such as "12:34". > > I do not like how I wrote this regular expression, is there way to > provide to `rx' function something like "[012]"? (any "012") or (any ?0 ?1 ?2) or (any "0-2") or (any (?0 . ?2)) Cheers -- t [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 195 bytes --] ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: Help improve regular expression for 24 hours format 2022-11-24 3:36 Help improve regular expression for 24 hours format Jean Louis 2022-11-24 5:50 ` tomas @ 2022-11-24 6:32 ` Yuri Khan 2022-11-24 8:59 ` Jean Louis 2022-11-24 13:09 ` Michael Heerdegen 2 siblings, 1 reply; 12+ messages in thread From: Yuri Khan @ 2022-11-24 6:32 UTC (permalink / raw) To: Jean Louis; +Cc: Help GNU Emacs On Thu, 24 Nov 2022 at 10:38, Jean Louis <bugs@gnu.support> wrote: > This regular expression shall match 24 hours format such as "12:34". > > I do not like how I wrote this regular expression, is there way to > provide to `rx' function something like "[012]"? I’d write it in classic regexp notation as \(?:\(?:[01][0-9]|2[0-3]\):\(?:[0-5][0-9]\)\) and probably leave like that as it’s readable enough as is. If you feel the need for rx here, then, as Tomas said, ‘any’ (aka ‘in’ and ‘char’) with ranges is your friend. (Also I don’t understand your use of ‘(= 1 …)’. Looks redundant to me.) ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: Help improve regular expression for 24 hours format 2022-11-24 6:32 ` Yuri Khan @ 2022-11-24 8:59 ` Jean Louis 2022-11-24 9:38 ` tomas 0 siblings, 1 reply; 12+ messages in thread From: Jean Louis @ 2022-11-24 8:59 UTC (permalink / raw) To: Yuri Khan; +Cc: Help GNU Emacs * Yuri Khan <yuri.v.khan@gmail.com> [2022-11-24 09:33]: > On Thu, 24 Nov 2022 at 10:38, Jean Louis <bugs@gnu.support> wrote: > > > This regular expression shall match 24 hours format such as "12:34". > > > > I do not like how I wrote this regular expression, is there way to > > provide to `rx' function something like "[012]"? > > I’d write it in classic regexp notation as > > \(?:\(?:[01][0-9]|2[0-3]\):\(?:[0-5][0-9]\)\) > > and probably leave like that as it’s readable enough as is. > > If you feel the need for rx here, then, as Tomas said, ‘any’ (aka ‘in’ > and ‘char’) with ranges is your friend. > > (Also I don’t understand your use of ‘(= 1 …)’. Looks redundant to > me.) Thanks, I make it now this way: (defvar rcd-rx-time (rx line-start (or "00" "01" "02" "03" "04" "05" "06" "07" "08" "09" "10" "11" "12" "13" "14" "15" "16" "17" "18" "19" "20" "21" "22" "23") ":" (any "0" "1" "2" "3" "4" "5") (any digit) line-end) "Regular expression for 24 hours format") ➜ "^\\(?:0[0-9]\\|1[0-9]\\|2[0-3]\\):[0-5][[:digit:]]$" I like to have `rx' notation, and it still looks way complicated. (string-match rcd-rx-time "00:00") ➜ 0 (string-match rcd-rx-time "30:00") ➜ nil (string-match rcd-rx-time "24:00") ➜ nil (string-match rcd-rx-time "23:69") ➜ nil (string-match rcd-rx-time "23:59") ➜ 0 -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: Help improve regular expression for 24 hours format 2022-11-24 8:59 ` Jean Louis @ 2022-11-24 9:38 ` tomas 2022-11-24 10:31 ` Jean Louis 0 siblings, 1 reply; 12+ messages in thread From: tomas @ 2022-11-24 9:38 UTC (permalink / raw) To: help-gnu-emacs; +Cc: Yuri Khan [-- Attachment #1: Type: text/plain, Size: 1878 bytes --] On Thu, Nov 24, 2022 at 11:59:20AM +0300, Jean Louis wrote: > * Yuri Khan <yuri.v.khan@gmail.com> [2022-11-24 09:33]: > > On Thu, 24 Nov 2022 at 10:38, Jean Louis <bugs@gnu.support> wrote: > > > > > This regular expression shall match 24 hours format such as "12:34". > > > > > > I do not like how I wrote this regular expression, is there way to > > > provide to `rx' function something like "[012]"? > > > > I’d write it in classic regexp notation as > > > > \(?:\(?:[01][0-9]|2[0-3]\):\(?:[0-5][0-9]\)\) > > > > and probably leave like that as it’s readable enough as is. > > > > If you feel the need for rx here, then, as Tomas said, ‘any’ (aka ‘in’ > > and ‘char’) with ranges is your friend. > > > > (Also I don’t understand your use of ‘(= 1 …)’. Looks redundant to > > me.) > > Thanks, I make it now this way: > > (defvar rcd-rx-time (rx line-start (or "00" "01" "02" "03" "04" "05" "06" "07" "08" "09" "10" "11" > "12" "13" "14" "15" "16" "17" "18" "19" "20" "21" "22" "23") > ":" (any "0" "1" "2" "3" "4" "5") (any digit) > line-end) > "Regular expression for 24 hours format") Hm. By distributive law, (or (seq (any "01") (any digit)) (seq "2" (any "03"))) should cover your hours part. And for the minutes's first digit, remember that `any' can do ranges: (any "0-5") resp. (any (?0 . ?5)) > ➜ "^\\(?:0[0-9]\\|1[0-9]\\|2[0-3]\\):[0-5][[:digit:]]$" Even taking inspiration on what the "compiler" did of your expression might lead you to a simpler (and more readable!) expression, e.g. (or (seq "0" (any digit)) (seq "1" (any digit)) (seq "2" (any "0-3"))) although slightly longer than my first proposal (perhaps the second is "quicker", but I'd let the regexp compiler sort that out: you are optimising for the human reader, after all). Cheers -- t [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 195 bytes --] ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: Help improve regular expression for 24 hours format 2022-11-24 9:38 ` tomas @ 2022-11-24 10:31 ` Jean Louis 2022-11-24 10:45 ` tomas 0 siblings, 1 reply; 12+ messages in thread From: Jean Louis @ 2022-11-24 10:31 UTC (permalink / raw) To: tomas; +Cc: help-gnu-emacs, Yuri Khan * tomas@tuxteam.de <tomas@tuxteam.de> [2022-11-24 12:40]: > > Thanks, I make it now this way: > > > > (defvar rcd-rx-time (rx line-start (or "00" "01" "02" "03" "04" "05" "06" "07" "08" "09" "10" "11" > > "12" "13" "14" "15" "16" "17" "18" "19" "20" "21" "22" "23") > > ":" (any "0" "1" "2" "3" "4" "5") (any digit) > > line-end) > > "Regular expression for 24 hours format") > > Hm. By distributive law, (or (seq (any "01") (any digit)) (seq "2" (any "03"))) > should cover your hours part. And for the minutes's first digit, remember that > `any' can do ranges: (any "0-5") resp. (any (?0 . ?5)) > > > ➜ "^\\(?:0[0-9]\\|1[0-9]\\|2[0-3]\\):[0-5][[:digit:]]$" > > Even taking inspiration on what the "compiler" did of your expression might > lead you to a simpler (and more readable!) expression, e.g. > > (or (seq "0" (any digit)) (seq "1" (any digit)) (seq "2" (any "0-3"))) > > although slightly longer than my first proposal (perhaps the second is > "quicker", but I'd let the regexp compiler sort that out: you are > optimising for the human reader, after all). Do you have completed example using: (or (seq "0" (any digit)) (seq "1" (any digit)) (seq "2" (any "0-3"))) ? -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: Help improve regular expression for 24 hours format 2022-11-24 10:31 ` Jean Louis @ 2022-11-24 10:45 ` tomas 2022-11-24 14:22 ` [SOLVED]: " Jean Louis 2022-11-24 14:30 ` Jean Louis 0 siblings, 2 replies; 12+ messages in thread From: tomas @ 2022-11-24 10:45 UTC (permalink / raw) To: help-gnu-emacs, Yuri Khan [-- Attachment #1: Type: text/plain, Size: 398 bytes --] On Thu, Nov 24, 2022 at 01:31:00PM +0300, Jean Louis wrote: [...] > Do you have completed example using: > (or (seq "0" (any digit)) (seq "1" (any digit)) (seq "2" (any "0-3"))) ? I'm not supposed to be doing this now, so the rest is left as an exercise to the reader, alas. Hint: look at the regexp your `rx' invocation produces and translate backwards from it. Cheers -- t [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 195 bytes --] ^ permalink raw reply [flat|nested] 12+ messages in thread
* [SOLVED]: Re: Help improve regular expression for 24 hours format 2022-11-24 10:45 ` tomas @ 2022-11-24 14:22 ` Jean Louis 2022-11-25 15:31 ` Emanuel Berg 2022-11-24 14:30 ` Jean Louis 1 sibling, 1 reply; 12+ messages in thread From: Jean Louis @ 2022-11-24 14:22 UTC (permalink / raw) To: tomas; +Cc: help-gnu-emacs, Yuri Khan * tomas@tuxteam.de <tomas@tuxteam.de> [2022-11-24 13:47]: > On Thu, Nov 24, 2022 at 01:31:00PM +0300, Jean Louis wrote: > > [...] > > > Do you have completed example using: > > (or (seq "0" (any digit)) (seq "1" (any digit)) (seq "2" (any "0-3"))) ? > > I'm not supposed to be doing this now, so the rest is left as an > exercise to the reader, alas. > > Hint: look at the regexp your `rx' invocation produces and translate > backwards from it. I did the exercise and I came up with the below. It looks much better this way. 🤝 Thanks much. (defvar rcd-rx-time (rx line-start (or (seq "0" (any digit)) (seq "1" (any digit)) (seq "2" (any "0-3"))) ":" (seq (any "0-5") (any digit)) line-end) "Regular expression for 24 hours format") ➜ "^\\(?:0[[:digit:]]\\|1[[:digit:]]\\|2[0-3]\\):[0-5][[:digit:]]$" -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [SOLVED]: Re: Help improve regular expression for 24 hours format 2022-11-24 14:22 ` [SOLVED]: " Jean Louis @ 2022-11-25 15:31 ` Emanuel Berg 2022-11-26 18:08 ` Jean Louis 0 siblings, 1 reply; 12+ messages in thread From: Emanuel Berg @ 2022-11-25 15:31 UTC (permalink / raw) To: help-gnu-emacs Jean Louis wrote: > I did the exercise and I came up with the below. It looks > much better this way. Thanks much. > > (defvar rcd-rx-time (rx line-start > (or (seq "0" (any digit)) (seq "1" (any digit)) (seq "2" (any "0-3"))) > ":" > (seq (any "0-5") (any digit)) > line-end) > "Regular expression for 24 hours format") > > -> "^\\(?:0[[:digit:]]\\|1[[:digit:]]\\|2[0-3]\\):[0-5][[:digit:]]$" This is also something that belongs in a library. -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [SOLVED]: Re: Help improve regular expression for 24 hours format 2022-11-25 15:31 ` Emanuel Berg @ 2022-11-26 18:08 ` Jean Louis 0 siblings, 0 replies; 12+ messages in thread From: Jean Louis @ 2022-11-26 18:08 UTC (permalink / raw) To: help-gnu-emacs * Emanuel Berg <incal@dataswamp.org> [2022-11-26 18:12]: > Jean Louis wrote: > > > I did the exercise and I came up with the below. It looks > > much better this way. Thanks much. > > > > (defvar rcd-rx-time (rx line-start > > (or (seq "0" (any digit)) (seq "1" (any digit)) (seq "2" (any "0-3"))) > > ":" > > (seq (any "0-5") (any digit)) > > line-end) > > "Regular expression for 24 hours format") > > > > -> "^\\(?:0[[:digit:]]\\|1[[:digit:]]\\|2[0-3]\\):[0-5][[:digit:]]$" > > This is also something that belongs in a library. Maybe it exists already somewhere? I use (org-calendar-select) but I missed selecting time. -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 12+ messages in thread
* [SOLVED]: Re: Help improve regular expression for 24 hours format 2022-11-24 10:45 ` tomas 2022-11-24 14:22 ` [SOLVED]: " Jean Louis @ 2022-11-24 14:30 ` Jean Louis 1 sibling, 0 replies; 12+ messages in thread From: Jean Louis @ 2022-11-24 14:30 UTC (permalink / raw) To: tomas; +Cc: help-gnu-emacs, Yuri Khan All that is that I can read date and time together: This is me special function for reading strings: (defun rcd-ask (&optional prompt initial-input default-value auto-initial-input) "Modified function `read-string'. This is shorter, simpler function that generates the prompt automatically, generates history variable automatically and inherits the input method. The input will be returned trimmed." (let* ((prompt (or prompt "Input data: ")) (history (rcd-ask-history-variable prompt)) (initial-input (cond (auto-initial-input (car (symbol-value history))) (initial-input initial-input))) (input (read-string prompt initial-input history default-value t)) (input (string-trim input))) input)) Then I have now regular expression by which I can read time in 24 hours format: (defvar rcd-rx-time (rx line-start (or (seq "0" (any digit)) (seq "1" (any digit)) (seq "2" (any "0-3"))) ":" (seq (any "0-5") (any digit)) line-end) "Regular expression for 24 hours format") Then I made simple function for that, it does not allow me to (defun rcd-read-24-hours-time (&optional prompt) (let* ((prompt (or prompt "Time (HH:MM): ")) (current-time (format-time-string "%H:%M")) (my-time "")) (while (not (string-match rcd-rx-time my-time)) (setq my-time (rcd-ask prompt current-time))) my-time)) (rcd-read-24-hours-time) ➜ "17:26" Then I have this one to read the date and give result in ISO format: (defun rcd-read-iso-date () (let* ((date (calendar-read-date)) (month (elt date 0)) (day (elt date 1)) (year (elt date 2))) (format "%04d-%02d-%02d" year month day))) (rcd-read-iso-date) ➜ "2022-11-24" Then it comes together like this: (defun rcd-read-date-time () (let ((date (rcd-read-iso-date)) (time (rcd-read-24-hours-time))) (format "%s %s" date time))) (rcd-read-date-time) ➜ "2022-11-24 17:26" Then I can use that type check to enter the "scheduled time" for messages to be sent, like: Scheduled time "2022-11-24 17:26:00+03" ID 56174 Date created "2022-11-24 09:03:40.049268" Date modified "2022-11-24 17:26:15.422416" User created "maddox" User modified "maddox" Subject nil Full message "🌅 Good morning" Message type "SMS" Status "Scheduled" From people ID nil From comm line ID nil From comm line nil To people ID "Joe Doe" To comm line ID nil To comm line "+xxxxxxxxxxxx" Related Hyperdocument #1 "My project" Related Hyperdocument #2 nil Related Hyperdocument #3 nil UUID "bbe5710d-0795-4f46-b6ce-7ae9f0f009f9" Scheduled time "2022-11-24 17:26:00+03" Time sent nil Canned nil In the next step I have to make a timer function to verify scheduled messages, so that they can be dispatched at specific time in future. My subject was about the time type check, in background it is all about human relationships. -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: Help improve regular expression for 24 hours format 2022-11-24 3:36 Help improve regular expression for 24 hours format Jean Louis 2022-11-24 5:50 ` tomas 2022-11-24 6:32 ` Yuri Khan @ 2022-11-24 13:09 ` Michael Heerdegen 2 siblings, 0 replies; 12+ messages in thread From: Michael Heerdegen @ 2022-11-24 13:09 UTC (permalink / raw) To: help-gnu-emacs Jean Louis <bugs@gnu.support> writes: > This regular expression shall match 24 hours format such as "12:34". > > I do not like how I wrote this regular expression, is there way to > provide to `rx' function something like "[012]"? Suggestion to ease learning: install and ask "xr.el": (xr "[012]") ==> ... Michael. ^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2022-11-26 18:08 UTC | newest] Thread overview: 12+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2022-11-24 3:36 Help improve regular expression for 24 hours format Jean Louis 2022-11-24 5:50 ` tomas 2022-11-24 6:32 ` Yuri Khan 2022-11-24 8:59 ` Jean Louis 2022-11-24 9:38 ` tomas 2022-11-24 10:31 ` Jean Louis 2022-11-24 10:45 ` tomas 2022-11-24 14:22 ` [SOLVED]: " Jean Louis 2022-11-25 15:31 ` Emanuel Berg 2022-11-26 18:08 ` Jean Louis 2022-11-24 14:30 ` Jean Louis 2022-11-24 13:09 ` Michael Heerdegen
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).