diff options
author | Mattias EngdegÄrd <mattiase@acm.org> | 2019-02-25 15:22:02 +0100 |
---|---|---|
committer | Mattias EngdegÄrd <mattiase@acm.org> | 2019-03-02 16:22:37 +0100 |
commit | 7bda34af52687440632127b4b79986e951b978b1 (patch) | |
tree | be661e3d387f6bea5043746309b7d337da9e9014 /lisp/emacs-lisp/regexp-opt.el | |
parent | da758046da74e33273265cd2e72a8aa1a0c9c7e3 (diff) | |
download | emacs-7bda34af52687440632127b4b79986e951b978b1.tar.gz emacs-7bda34af52687440632127b4b79986e951b978b1.tar.bz2 emacs-7bda34af52687440632127b4b79986e951b978b1.zip |
Correct regexp-opt return value for empty string list
When regexp-opt is called with an empty list of strings, return a regexp
that doesn't match anything instead of the empty string (Bug#20307).
* doc/lispref/searching.texi (Regular Expression Functions):
* etc/NEWS:
Document the new behaviour.
* lisp/emacs-lisp/regexp-opt.el (regexp-opt):
Return a never-match regexp for empty inputs.
Diffstat (limited to 'lisp/emacs-lisp/regexp-opt.el')
-rw-r--r-- | lisp/emacs-lisp/regexp-opt.el | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/lisp/emacs-lisp/regexp-opt.el b/lisp/emacs-lisp/regexp-opt.el index d0c5f2d3fc4..4404b905a6f 100644 --- a/lisp/emacs-lisp/regexp-opt.el +++ b/lisp/emacs-lisp/regexp-opt.el @@ -90,6 +90,9 @@ Each string should be unique in STRINGS and should not contain any regexps, quoted or not. Optional PAREN specifies how the returned regexp is surrounded by grouping constructs. +If STRINGS is the empty list, the return value is a regexp that +never matches anything. + The optional argument PAREN can be any of the following: a string @@ -140,14 +143,18 @@ usually more efficient than that of a simplified version: (sorted-strings (delete-dups (sort (copy-sequence strings) 'string-lessp))) (re - ;; If NOREORDER is non-nil and the list contains a prefix - ;; of another string, we give up all attempts at optimisation. - ;; There is plenty of room for improvement (Bug#34641). - (if (and noreorder (regexp-opt--contains-prefix sorted-strings)) - (concat (or open "\\(?:") - (mapconcat #'regexp-quote strings "\\|") - "\\)") - (regexp-opt-group sorted-strings (or open t) (not open))))) + (cond + ;; No strings: return a\` which cannot match anything. + ((null strings) + (concat (or open "\\(?:") "a\\`\\)")) + ;; If we cannot reorder, give up all attempts at + ;; optimisation. There is room for improvement (Bug#34641). + ((and noreorder (regexp-opt--contains-prefix sorted-strings)) + (concat (or open "\\(?:") + (mapconcat #'regexp-quote strings "\\|") + "\\)")) + (t + (regexp-opt-group sorted-strings (or open t) (not open)))))) (cond ((eq paren 'words) (concat "\\<" re "\\>")) ((eq paren 'symbols) |