我正试图摆脱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.正则表达式中的错误是什么?
答案 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*
<
个空格
)*
该组重复零次或多次Here使用命名组来展示其工作原理的示例, second 组是一个多重匹配,最后一个是D。