emacs-diffs
[Top][All Lists]
Advanced

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

emacs-27 5a21aaf: rx: Use longest match for all-string 'or' forms (bug#3


From: Mattias Engdegård
Subject: emacs-27 5a21aaf: rx: Use longest match for all-string 'or' forms (bug#37659)
Date: Wed, 12 Feb 2020 06:20:32 -0500 (EST)

branch: emacs-27
commit 5a21aaff468ec3f0337117707cda4254cbef8de7
Author: Mattias Engdegård <address@hidden>
Commit: Mattias Engdegård <address@hidden>

    rx: Use longest match for all-string 'or' forms (bug#37659)
    
    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       | 5 ++++-
 lisp/emacs-lisp/rx.el            | 2 +-
 test/lisp/emacs-lisp/rx-tests.el | 2 +-
 3 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/doc/lispref/searching.texi b/doc/lispref/searching.texi
index 3d7ea93..5f4509a 100644
--- a/doc/lispref/searching.texi
+++ b/doc/lispref/searching.texi
@@ -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{}}.
 
diff --git a/lisp/emacs-lisp/rx.el b/lisp/emacs-lisp/rx.el
index 03af053..b4cab57 100644
--- a/lisp/emacs-lisp/rx.el
+++ b/lisp/emacs-lisp/rx.el
@@ -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))
diff --git a/test/lisp/emacs-lisp/rx-tests.el b/test/lisp/emacs-lisp/rx-tests.el
index e19e626..a6c172a 100644
--- a/test/lisp/emacs-lisp/rx-tests.el
+++ b/test/lisp/emacs-lisp/rx-tests.el
@@ -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 (|))



reply via email to

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