]> git.eshelyaron.com Git - emacs.git/commitdiff
Use [^z-a] for matching any character (anychar/anything) in rx
authorMattias Engdegård <mattiase@acm.org>
Wed, 9 Oct 2019 08:22:10 +0000 (10:22 +0200)
committerMattias Engdegård <mattiase@acm.org>
Fri, 18 Oct 2019 12:46:12 +0000 (14:46 +0200)
* lisp/emacs-lisp/rx.el (rx--translate-symbol):
* test/lisp/emacs-lisp/rx-tests.el (rx-any, rx-atoms):
Use [^z-a] instead of ".\\|\n" for anychar.

The new expression is faster (about 2×) and does not allocate regexp
stack space.  For example, (0+ anychar) now matches strings of any
size (bug#37659).

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

index cf02df239fee07edf38ad26235edc36c0e16e8b4..87b3133b7f56946e4d53b1e6d9945caa8c103d38 100644 (file)
@@ -136,7 +136,7 @@ Each entry is:
     ;; Use `list' instead of a quoted list to wrap the strings here,
     ;; since the return value may be mutated.
     ((or 'nonl 'not-newline 'any) (cons (list ".") t))
-    ((or 'anychar 'anything)      (rx--translate-form '(or nonl "\n")))
+    ((or 'anychar 'anything)      (cons (list "[^z-a]") t))
     ('unmatchable                 (rx--empty))
     ((or 'bol 'line-start)        (cons (list "^") 'lseq))
     ((or 'eol 'line-end)          (cons (list "$") 'rseq))
index 903b191c98edd0308c723fc0890b6f6d76c14694..ef2541d83af1f841ae586172effd96cc2dac465c 100644 (file)
   (should (equal (rx (not (any "!a" "0-8" digit nonascii)))
                  "[^!0-8a[:digit:][:nonascii:]]"))
   (should (equal (rx (any) (not (any)))
-                 "\\`a\\`\\(?:.\\|\n\\)"))
+                 "\\`a\\`[^z-a]"))
   (should (equal (rx (any "") (not (any "")))
-                 "\\`a\\`\\(?:.\\|\n\\)")))
+                 "\\`a\\`[^z-a]")))
 
 (ert-deftest rx-pcase ()
   (should (equal (pcase "a 1 2 3 1 1 b"
 
 (ert-deftest rx-atoms ()
   (should (equal (rx anychar anything)
-                 "\\(?:.\\|\n\\)\\(?:.\\|\n\\)"))
+                 "[^z-a][^z-a]"))
   (should (equal (rx unmatchable)
                  "\\`a\\`"))
   (should (equal (rx line-start not-newline nonl any line-end)