summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/lispref/searching.texi6
-rw-r--r--etc/NEWS1
-rw-r--r--lisp/emacs-lisp/rx.el5
-rw-r--r--test/lisp/emacs-lisp/rx-tests.el2
4 files changed, 12 insertions, 2 deletions
diff --git a/doc/lispref/searching.texi b/doc/lispref/searching.texi
index 2274bab002c..a6c6bf2d4a0 100644
--- a/doc/lispref/searching.texi
+++ b/doc/lispref/searching.texi
@@ -1083,6 +1083,11 @@ Corresponding string regexp: @samp{@var{A}@var{B}@dots{}}
Match exactly one of the @var{rx}s, trying from left to right.
Without arguments, the expression will not match anything at all.@*
Corresponding string regexp: @samp{@var{A}\|@var{B}\|@dots{}}.
+
+@item @code{unmatchable}
+@cindex @code{unmatchable} in rx
+Refuse any match. Equivalent to @code{(or)}.
+@xref{regexp-unmatchable}.
@end table
@subsubheading Repetition
@@ -1806,6 +1811,7 @@ list of characters @var{chars}.
@c Internal functions: regexp-opt-group
+@anchor{regexp-unmatchable}
@defvar regexp-unmatchable
This variable contains a regexp that is guaranteed not to match any
string at all. It is particularly useful as default value for
diff --git a/etc/NEWS b/etc/NEWS
index 25c1cef9516..5794af5b601 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1844,6 +1844,7 @@ the 128...255 range, as expected.
matches the empty string, each being an identity for the operation.
This also works for their aliases: '|' for 'or'; ':', 'and' and
'sequence' for 'seq'.
+The symbol 'unmatchable' can be used as an alternative to (or).
---
*** 'regexp' and new 'literal' accept arbitrary lisp as arguments.
diff --git a/lisp/emacs-lisp/rx.el b/lisp/emacs-lisp/rx.el
index 6c0b2069302..cf02df239fe 100644
--- a/lisp/emacs-lisp/rx.el
+++ b/lisp/emacs-lisp/rx.el
@@ -126,7 +126,6 @@ Each entry is:
(get name 'rx-definition)))
;; TODO: Additions to consider:
-;; - A name for (or), maybe `unmatchable'.
;; - A construct like `or' but without the match order guarantee,
;; maybe `unordered-or'. Useful for composition or generation of
;; alternatives; permits more effective use of regexp-opt.
@@ -138,6 +137,7 @@ Each entry is:
;; since the return value may be mutated.
((or 'nonl 'not-newline 'any) (cons (list ".") t))
((or 'anychar 'anything) (rx--translate-form '(or nonl "\n")))
+ ('unmatchable (rx--empty))
((or 'bol 'line-start) (cons (list "^") 'lseq))
((or 'eol 'line-end) (cons (list "$") 'rseq))
((or 'bos 'string-start 'bot 'buffer-start) (cons (list "\\`") t))
@@ -912,7 +912,7 @@ can expand to any number of values."
"List of built-in rx function-like symbols.")
(defconst rx--builtin-symbols
- (append '(nonl not-newline any anychar anything
+ (append '(nonl not-newline any anychar anything unmatchable
bol eol line-start line-end
bos eos string-start string-end
bow eow word-start word-end
@@ -1016,6 +1016,7 @@ CHAR Match a literal character.
or a character class.
not-newline Match any character except a newline. Alias: nonl.
anychar Match any character. Alias: anything.
+unmatchable Never match anything at all.
CHARCLASS Match a character from a character class. One of:
alpha, alphabetic, letter Alphabetic characters (defined by Unicode).
diff --git a/test/lisp/emacs-lisp/rx-tests.el b/test/lisp/emacs-lisp/rx-tests.el
index d4524e5a251..903b191c98e 100644
--- a/test/lisp/emacs-lisp/rx-tests.el
+++ b/test/lisp/emacs-lisp/rx-tests.el
@@ -186,6 +186,8 @@
(ert-deftest rx-atoms ()
(should (equal (rx anychar anything)
"\\(?:.\\|\n\\)\\(?:.\\|\n\\)"))
+ (should (equal (rx unmatchable)
+ "\\`a\\`"))
(should (equal (rx line-start not-newline nonl any line-end)
"^...$"))
(should (equal (rx bol string-start string-end buffer-start buffer-end