]> git.eshelyaron.com Git - emacs.git/commitdiff
rx: Use longest match for all-string 'or' forms (bug#37659)
authorMattias Engdegård <mattiase@acm.org>
Tue, 11 Feb 2020 12:23:10 +0000 (13:23 +0100)
committerMattias Engdegård <mattiase@acm.org>
Wed, 12 Feb 2020 10:20:47 +0000 (11:20 +0100)
Revert to the Emacs 26 semantics that always gave the longest match
for rx 'or' forms with only string arguments.  This guarantee was
never well documented, but it is useful and people likely have come to
rely on it.  For example, prior to this change,

 (rx (or ">" ">="))

matched ">" even if the text contained ">=".

* lisp/emacs-lisp/rx.el (rx--translate-or): Don't tell regexp-opt to
preserve the matching order.
* doc/lispref/searching.texi (Rx Constructs): Document the
longest-match guarantee for all-string 'or' forms.
* test/lisp/emacs-lisp/rx-tests.el (rx-or): Update test.

doc/lispref/searching.texi
lisp/emacs-lisp/rx.el
test/lisp/emacs-lisp/rx-tests.el

index 3d7ea932863517aebd30bbba0ab0c250c5891949..5f4509a8b43fb6128045ea0908e6ad4c89806a15 100644 (file)
@@ -1080,7 +1080,10 @@ Corresponding string regexp: @samp{@var{A}@var{B}@dots{}}
 @cindex @code{or} in rx
 @itemx @code{(| @var{rx}@dots{})}
 @cindex @code{|} in rx
-Match exactly one of the @var{rx}s, trying from left to right.
+Match exactly one of the @var{rx}s.
+If all arguments are string literals, the longest possible match
+will always be used.  Otherwise, either the longest match or the
+first (in left-to-right order) will be used.
 Without arguments, the expression will not match anything at all.@*
 Corresponding string regexp: @samp{@var{A}\|@var{B}\|@dots{}}.
 
index 03af053c91e84b9e69b3c960c86b70356766e4a9..b4cab5715da146a2faa04e45ce0a09342d1aaa7d 100644 (file)
@@ -290,7 +290,7 @@ Return (REGEXP . PRECEDENCE)."
    ((null (cdr body))              ; Single item.
     (rx--translate (car body)))
    ((rx--every #'stringp body)     ; All strings.
-    (cons (list (regexp-opt body nil t))
+    (cons (list (regexp-opt body nil))
           t))
    ((rx--every #'rx--charset-p body)  ; All charsets.
     (rx--translate-union nil body))
index e19e626527bbb1a92a8ecfade719aee41ab4e1b1..a6c172adfe7b6f59a1f13b0bc1719bcf59498e36 100644 (file)
@@ -43,7 +43,7 @@
   (should (equal (rx (or "ab" (| "c" nonl) "de"))
                  "ab\\|c\\|.\\|de"))
   (should (equal (rx (or "ab" "abc" "a"))
-                 "\\(?:ab\\|abc\\|a\\)"))
+                 "\\(?:a\\(?:bc?\\)?\\)"))
   (should (equal (rx (| nonl "a") (| "b" blank))
                  "\\(?:.\\|a\\)\\(?:b\\|[[:blank:]]\\)"))
   (should (equal (rx (|))