]> git.eshelyaron.com Git - emacs.git/commitdiff
Make the rx operators \? and \?? behave correctly
authorMattias EngdegÄrd <mattiase@acm.org>
Wed, 16 Jan 2019 13:57:12 +0000 (14:57 +0100)
committerEli Zaretskii <eliz@gnu.org>
Fri, 1 Feb 2019 09:39:43 +0000 (11:39 +0200)
* 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.

lisp/emacs-lisp/rx.el
test/lisp/emacs-lisp/rx-tests.el

index a39fe55c32243d8cfe430ae30876d6c5e34e9799..8b4551d0d36e62f751cadaecc23c8f6e7b58e6ac 100644 (file)
@@ -733,8 +733,8 @@ If OP is anything else, produce a greedy regexp if `rx-greedy-flag'
 is non-nil."
   (rx-check form)
   (setq form (rx-trans-forms form))
-  (let ((suffix (cond ((memq (car form) '(* + ?\s)) "")
-                     ((memq (car form) '(*? +? ??)) "?")
+  (let ((suffix (cond ((memq (car form) '(* + \? ?\s)) "")
+                     ((memq (car form) '(*? +? \?? ??)) "?")
                      (rx-greedy-flag "")
                      (t "?")))
        (op (cond ((memq (car form) '(* *? 0+ zero-or-more)) "*")
index 392a38ab95b2499343ed4c49486161e2a3d9794e..f15e1016f7c8226a9482cff3003cd5fea13031a3 100644 (file)
                     (list u v)))
                  '("1" "3"))))
 
+(ert-deftest rx-kleene ()
+  "Test greedy and non-greedy repetition operators."
+  (should (equal (rx (* "a") (+ "b") (\? "c") (?\s "d")
+                     (*? "e") (+? "f") (\?? "g") (?? "h"))
+                 "a*b+c?d?e*?f+?g??h??"))
+  (should (equal (rx (zero-or-more "a") (0+ "b")
+                     (one-or-more "c") (1+ "d")
+                     (zero-or-one "e") (optional "f") (opt "g"))
+                 "a*b*c+d+e?f?g?"))
+  (should (equal (rx (minimal-match
+                      (seq (* "a") (+ "b") (\? "c") (?\s "d")
+                           (*? "e") (+? "f") (\?? "g") (?? "h"))))
+                 "a*b+c?d?e*?f+?g??h??"))
+  (should (equal (rx (minimal-match
+                      (seq (zero-or-more "a") (0+ "b")
+                           (one-or-more "c") (1+ "d")
+                           (zero-or-one "e") (optional "f") (opt "g"))))
+                 "a*?b*?c+?d+?e??f??g??"))
+  (should (equal (rx (maximal-match
+                      (seq (* "a") (+ "b") (\? "c") (?\s "d")
+                         (*? "e") (+? "f") (\?? "g") (?? "h"))))
+                 "a*b+c?d?e*?f+?g??h??")))
+
 (provide 'rx-tests)
 ;; rx-tests.el ends here.