aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMattias EngdegÄrd2019-01-16 14:57:12 +0100
committerEli Zaretskii2019-02-01 11:39:43 +0200
commitdecdff76fb185f87145940cc3b91549f84600a87 (patch)
treecc3bc3fd672616f1880472c066bee367450e072d
parentb01a4295c2f9bb58858880e4e28b05cc8396791c (diff)
downloademacs-decdff76fb185f87145940cc3b91549f84600a87.tar.gz
emacs-decdff76fb185f87145940cc3b91549f84600a87.zip
Make the rx operators \? and \?? behave correctly
* lisp/emacs-lisp/rx.el (rx-kleene): Treat \? and \?? like ? and ?? (Bug#34100). * test/lisp/emacs-lisp/rx-tests.el: Add tests for all repetition operators.
-rw-r--r--lisp/emacs-lisp/rx.el4
-rw-r--r--test/lisp/emacs-lisp/rx-tests.el23
2 files changed, 25 insertions, 2 deletions
diff --git a/lisp/emacs-lisp/rx.el b/lisp/emacs-lisp/rx.el
index a39fe55c322..8b4551d0d36 100644
--- a/lisp/emacs-lisp/rx.el
+++ b/lisp/emacs-lisp/rx.el
@@ -733,8 +733,8 @@ If OP is anything else, produce a greedy regexp if `rx-greedy-flag'
733is non-nil." 733is non-nil."
734 (rx-check form) 734 (rx-check form)
735 (setq form (rx-trans-forms form)) 735 (setq form (rx-trans-forms form))
736 (let ((suffix (cond ((memq (car form) '(* + ?\s)) "") 736 (let ((suffix (cond ((memq (car form) '(* + \? ?\s)) "")
737 ((memq (car form) '(*? +? ??)) "?") 737 ((memq (car form) '(*? +? \?? ??)) "?")
738 (rx-greedy-flag "") 738 (rx-greedy-flag "")
739 (t "?"))) 739 (t "?")))
740 (op (cond ((memq (car form) '(* *? 0+ zero-or-more)) "*") 740 (op (cond ((memq (car form) '(* *? 0+ zero-or-more)) "*")
diff --git a/test/lisp/emacs-lisp/rx-tests.el b/test/lisp/emacs-lisp/rx-tests.el
index 392a38ab95b..f15e1016f7c 100644
--- a/test/lisp/emacs-lisp/rx-tests.el
+++ b/test/lisp/emacs-lisp/rx-tests.el
@@ -65,5 +65,28 @@
65 (list u v))) 65 (list u v)))
66 '("1" "3")))) 66 '("1" "3"))))
67 67
68(ert-deftest rx-kleene ()
69 "Test greedy and non-greedy repetition operators."
70 (should (equal (rx (* "a") (+ "b") (\? "c") (?\s "d")
71 (*? "e") (+? "f") (\?? "g") (?? "h"))
72 "a*b+c?d?e*?f+?g??h??"))
73 (should (equal (rx (zero-or-more "a") (0+ "b")
74 (one-or-more "c") (1+ "d")
75 (zero-or-one "e") (optional "f") (opt "g"))
76 "a*b*c+d+e?f?g?"))
77 (should (equal (rx (minimal-match
78 (seq (* "a") (+ "b") (\? "c") (?\s "d")
79 (*? "e") (+? "f") (\?? "g") (?? "h"))))
80 "a*b+c?d?e*?f+?g??h??"))
81 (should (equal (rx (minimal-match
82 (seq (zero-or-more "a") (0+ "b")
83 (one-or-more "c") (1+ "d")
84 (zero-or-one "e") (optional "f") (opt "g"))))
85 "a*?b*?c+?d+?e??f??g??"))
86 (should (equal (rx (maximal-match
87 (seq (* "a") (+ "b") (\? "c") (?\s "d")
88 (*? "e") (+? "f") (\?? "g") (?? "h"))))
89 "a*b+c?d?e*?f+?g??h??")))
90
68(provide 'rx-tests) 91(provide 'rx-tests)
69;; rx-tests.el ends here. 92;; rx-tests.el ends here.