On Thu, Nov 24, 2022 at 11:59:20AM +0300, Jean Louis wrote: > * Yuri Khan [2022-11-24 09:33]: > > On Thu, 24 Nov 2022 at 10:38, 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]"? > > > > 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