[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
(regexp-opt-depth "[\\(]") => 1 :-(
From: |
Alan Mackenzie |
Subject: |
(regexp-opt-depth "[\\(]") => 1 :-( |
Date: |
Sun, 20 Apr 2003 22:30:03 +0000 (GMT) |
There Is No Alternative: regexp-opt-depth MUST analyse its argument
properly. The following rewrite of regexp-opt-depth does just that.
[Well, OK, it would be as well for somebody else to check the formulation
of regexp-opt-not-groupie*-re. ;-]
The patch below passes the following test cases:
(regexp-opt-depth "(asdf)") => 0
(regexp-opt-depth "\\(asdf\\)") => 1
(regexp-opt-depth "\\(\\(asdf\\)\\)") => 2
(regexp-opt-depth "\\(?:asdf\\)") => 0
(regexp-opt-depth "[\\(]") => 0
(regexp-opt-depth "[a]\\(]asd\\)") => 1
(regexp-opt-depth "[^a]\\(]asd\\)") => 1
(regexp-opt-depth "[]\\(]asd)") => 0
(regexp-opt-depth "[^]\\(]asd)") => 0
(regexp-opt-depth "\\(? \\)") signals "invalid regexp".
*************************************************************************
*** regexp-opt.1.24.el Fri Apr 18 18:34:34 2003
--- regexp-opt.acm.1.24.el Sun Apr 20 22:05:33 2003
***************
*** 110,115 ****
--- 110,124 ----
(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 "\\[^?]?[^]]*]")
+ (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,130 ****
(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)))
count)))
;;; Workhorse functions.
--- 129,141 ----
(string-match regexp "")
;; Count the number of open parentheses in REGEXP.
(let ((count 0) start)
! (while
! (progn
! (string-match regexp-opt-not-groupie*-re regexp start)
! (setq start (match-end 0))
! (< start (1- (length regexp))))
! (setq count (1+ count)
! start (+ start 2))) ; step START over "\\("
count)))
;;; Workhorse functions.
*************************************************************************
--
Alan Mackenzie (Munich, Germany)
- (regexp-opt-depth "[\\(]") => 1 :-(,
Alan Mackenzie <=