help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Help improve regular expression for 24 hours format


From: tomas
Subject: Re: Help improve regular expression for 24 hours format
Date: Thu, 24 Nov 2022 10:38:27 +0100

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: signature.asc
Description: PGP signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]