mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2024-11-24 07:20:37 +00:00
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.
This commit is contained in:
parent
2b12c2b6f2
commit
5a21aaff46
@ -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{}}.
|
||||
|
||||
|
@ -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))
|
||||
|
@ -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 (|))
|
||||
|
Loading…
Reference in New Issue
Block a user