rx: Improve 'or' compositionality (bug#37659)
Perform 'regexp-opt' on nested 'or' forms, and after expansion of user-defined and 'eval' forms. Characters are now turned into strings for wider 'regexp-opt' scope. This preserves the longest-match semantics for string in 'or' forms over composition. * doc/lispref/searching.texi (Rx Constructs): Document. * lisp/emacs-lisp/rx.el (rx--normalise-or-arg) (rx--all-string-or-args): New. (rx--translate-or): Normalise arguments first, and check for strings in subforms. (rx--expand-eval): Extracted from rx--translate-eval. (rx--translate-eval): Call rx--expand-eval. * test/lisp/emacs-lisp/rx-tests.el (rx-or, rx-def-in-or): Add tests. * etc/NEWS: Announce.
This commit is contained in:
parent
6b48aedb6b
commit
49d3cd90bd
4 changed files with 69 additions and 31 deletions
|
@ -42,13 +42,24 @@
|
|||
(ert-deftest rx-or ()
|
||||
(should (equal (rx (or "ab" (| "c" nonl) "de"))
|
||||
"ab\\|c\\|.\\|de"))
|
||||
(should (equal (rx (or "ab" "abc" "a"))
|
||||
(should (equal (rx (or "ab" "abc" ?a))
|
||||
"\\(?:a\\(?:bc?\\)?\\)"))
|
||||
(should (equal (rx (or "ab" (| (or "abcd" "abcde")) (or "a" "abc")))
|
||||
"\\(?:a\\(?:b\\(?:c\\(?:de?\\)?\\)?\\)?\\)"))
|
||||
(should (equal (rx (or "a" (eval (string ?a ?b))))
|
||||
"\\(?:ab?\\)"))
|
||||
(should (equal (rx (| nonl "a") (| "b" blank))
|
||||
"\\(?:.\\|a\\)\\(?:b\\|[[:blank:]]\\)"))
|
||||
(should (equal (rx (|))
|
||||
"\\`a\\`")))
|
||||
|
||||
(ert-deftest rx-def-in-or ()
|
||||
(rx-let ((a b)
|
||||
(b (or "abc" c))
|
||||
(c ?a))
|
||||
(should (equal (rx (or a (| "ab" "abcde") "abcd"))
|
||||
"\\(?:a\\(?:b\\(?:c\\(?:de?\\)?\\)?\\)?\\)"))))
|
||||
|
||||
(ert-deftest rx-char-any ()
|
||||
"Test character alternatives with `]' and `-' (Bug#25123)."
|
||||
(should (equal
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue