emacs lisp正则表达式来检测C ++模板

时间:2012-10-09 10:33:57

标签: regex lisp

我正试图摆脱C ++模板表达式,存储到属性类型中,每种类型的类,因此来自类型

`A< B< C< D> > >

我想提取单个类型A,B,C,D并将它们放入列表中 我在lisp中编写了以下代码:

(if (string-match "\\(\\w+\\)<+\\(\\w+\\)>+$" property-type)
    (progn
      (setq current-include (match-string 1 property-type) )
      (setq current-recursive-property-type (match-string 2 property-type))

然而匹配错误,因为第一个匹配(current-include)是C而余数是D.正则表达式中的错误是什么?

2 个答案:

答案 0 :(得分:1)

正则表达式根据定义无法解析任意深层嵌套组,因此通常使用regexp无法实现该任务,但是,在这种特殊情况下,您可以假装将字符串拆分为字符?\<和删除空子字符串时?\>

(split-string "A< B < C < D > > >" "\\s-*[,<>]+\\s-*" t)

似乎可以做你想做的事。

另请注意,如果要与大量文本进行匹配,并且必须使其成为多行表达式,则很可能效率非常低。所以你可以改用这样的东西:

(defun parse-c++-types (type)
  (let ((current 0) c types word)
    (while (< current (length type))
      (setq c (aref type current))
      (if (or (char-equal c ?\<) (char-equal c ?\>))
          (when word
            (setq types (cons (coerce word 'string) types)
                  word nil))
        (unless (memberp c '(?\, ?\ ))
          (setq word (cons c word))))
      (incf current))
    (reverse types)))

(parse-c++-types "A< B < C < D > > >")

答案 1 :(得分:0)

假设每个类名都在<之前,这是正确的吗?如果是这样,您可以轻松匹配(未转义)

(\w+)(?:\s*<\s*(\w+))*

提取任何单个类名。

  • (\w+)是第一堂课
  • (?:是非捕获组
      \s*<\s* 之前和之后
    • <个空格
    • (\ ​​W +)
    • )*该组重复零次或多次

Here使用命名组来展示其工作原理的示例, second 组是一个多重匹配,最后一个是D。

相关问题