From: Stefan Monnier <monnier@iro.umontreal.ca>
To: emacs-devel@gnu.org
Subject: Ugly regexps
Date: Tue, 02 Mar 2021 19:32:20 -0500 [thread overview]
Message-ID: <jwvk0qpjd31.fsf-monnier+emacs@gnu.org> (raw)
BTW, while this theme of ugly regexps keeps coming up, how 'bout we add
a new function `ere` which converts between the ERE style of regexps
where grouping parens are not escaped (and plain chars meant to match
an actual paren need to be escaped instead) to ELisp-style regexps?
So you can do
(string-match (ere "\\(def(macro|un|subst) .{1,}"))
instead of
(string-match "(def\\(macro\\|un\\|subst\\) .\\{1,\\}")
?
Stefan
(defun ere (re)
"Convert an ERE-style regexp RE to an Emacs-style regexp."
(let ((pos 0)
(last 0)
(chunks '()))
(while (string-match "\\\\.\\|[{}()|]" re pos)
(let ((beg (match-beginning 0))
(end (match-end 0)))
(when (subregexp-context-p re beg)
(cond
;; A normal paren: add a backslash.
((= (1+ beg) end)
(push (substring re last beg) chunks) (setq last beg)
(push "\\" chunks))
;; A grouping paren: skip the backslash.
((memq (aref re (1+ beg)) '(?\( ?\) ?\{ ?\} ?\|))
(push (substring re last beg) chunks)
(setq last (1+ beg)))))
(setq pos end)))
(mapconcat #'identity (nreverse (cons (substring re last) chunks)) "")))
next reply other threads:[~2021-03-03 0:32 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-03 0:32 Stefan Monnier [this message]
2021-03-03 1:32 ` Ugly regexps Stefan Kangas
2021-03-03 2:08 ` Stefan Kangas
2021-03-03 6:19 ` Eli Zaretskii
2021-03-03 20:46 ` Alan Mackenzie
2021-03-04 18:35 ` Stefan Kangas
2021-03-03 6:00 ` Eli Zaretskii
2021-03-03 15:46 ` Stefan Monnier
2021-03-03 16:30 ` Eli Zaretskii
2021-03-03 17:44 ` Stefan Monnier
2021-03-03 18:46 ` Stefan Kangas
2021-03-03 19:21 ` Eli Zaretskii
2021-03-03 19:50 ` Stefan Kangas
2021-03-03 20:16 ` Stefan Kangas
2021-03-03 19:50 ` Stefan Kangas
2021-03-03 19:58 ` Dmitry Gutov
2021-03-03 20:07 ` [External] : " Drew Adams
2021-03-03 20:31 ` Stefan Kangas
2021-03-03 22:17 ` Drew Adams
2021-03-03 22:32 ` Stefan Monnier
2021-03-03 20:32 ` Stefan Monnier
2021-03-04 5:47 ` Eli Zaretskii
2021-03-04 10:49 ` Lars Ingebrigtsen
2021-03-04 11:25 ` Mattias Engdegård
2021-03-04 11:28 ` Alan Mackenzie
2021-03-04 14:11 ` Eli Zaretskii
2021-03-04 14:25 ` Dmitry Gutov
2021-03-04 14:50 ` tomas
2021-03-04 15:04 ` Dmitry Gutov
2021-03-05 5:45 ` Richard Stallman
2021-03-05 11:47 ` Dmitry Gutov
2021-03-06 5:11 ` Richard Stallman
2021-03-04 15:05 ` Dmitry Gutov
2021-03-04 15:11 ` Eli Zaretskii
2021-03-03 19:32 ` [External] : " Drew Adams
2021-03-03 7:09 ` Helmut Eller
2021-03-03 14:11 ` Stefan Kangas
2021-03-03 16:40 ` Stefan Monnier
2021-03-03 15:49 ` Stefan Monnier
2021-03-03 12:17 ` Dmitry Gutov
2021-03-03 15:48 ` Stefan Monnier
2021-03-03 13:57 ` Lars Ingebrigtsen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=jwvk0qpjd31.fsf-monnier+emacs@gnu.org \
--to=monnier@iro.umontreal.ca \
--cc=emacs-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
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).