# HG changeset patch # User Juanma Barranquero # Date 1051399499 0 # Node ID 645707022f8fa8098771902d0c28b18f4701686e # Parent e28c4c84cdf5bcd5a230bd22c44ba137d229138e (regexp-opt-depth): Don't count a "//(" which appears inside a character set. (regexp-opt-not-groupie*-re): New constant. diff -r e28c4c84cdf5 -r 645707022f8f lisp/emacs-lisp/regexp-opt.el --- a/lisp/emacs-lisp/regexp-opt.el Sat Apr 26 09:02:00 2003 +0000 +++ b/lisp/emacs-lisp/regexp-opt.el Sat Apr 26 23:24:59 2003 +0000 @@ -110,6 +110,24 @@ (re (regexp-opt-group sorted-strings open))) (if words (concat "\\<" re "\\>") re)))) +(defconst regexp-opt-not-groupie*-re + (let* ((harmless-ch "[^\\\\[]") + (esc-pair-not-lp "\\\\[^(]") + (class-harmless-ch "[^][]") + (class-lb-harmless "[^]:]") + (class-lb-colon-maybe-charclass ":\\([a-z]+:]\\)?") + (class-lb (concat "\\[\\(" class-lb-harmless + "\\|" class-lb-colon-maybe-charclass "\\)")) + (class + (concat "\\[^?]?" + "\\(" class-harmless-ch + "\\|" class-lb "\\)*" + "\\[?]")) ; special handling for bare [ at end of re + (shy-lp "\\\\(\\?:")) + (concat "\\(" harmless-ch "\\|" esc-pair-not-lp + "\\|" class "\\|" shy-lp "\\)*")) + "Matches any part of a regular expression EXCEPT for non-shy \"\\\\(\"s") + ;;;###autoload (defun regexp-opt-depth (regexp) "Return the depth of REGEXP. @@ -120,11 +138,12 @@ (string-match regexp "") ;; Count the number of open parentheses in REGEXP. (let ((count 0) start) - (while (string-match "\\(\\`\\|[^\\]\\)\\\\\\(\\\\\\\\\\)*([^?]" - regexp start) - (setq count (1+ count) - ;; Go back 2 chars (one for [^?] and one for [^\\]). - start (- (match-end 0) 2))) + (while + (progn + (string-match regexp-opt-not-groupie*-re regexp start) + (setq start ( + (match-end 0) 2)) ; +2 for "\\(" after match-end. + (<= start (length regexp))) + (setq count (1+ count))) count))) ;;; Workhorse functions.