我需要一个Emacs正则表达式来找到"对于"循环

时间:2017-11-06 06:09:03

标签: regex emacs lisp elisp

我试图编写一个Emacs lisp函数来查找所有" for"在C文件中循环并计算它们的长度。我还没找到一个正则表达式。将找到所有" for"声明。 (一旦我这样做,很容易计算循环长度。)正则表达式

"^[ \t]*for[ \t]*(.*\\;.*\\;.*)[:ascii:]*[^{\;]"

找到诸如

for (a;b;d)  {

}

for (a;d;c) {ccc ;}

但不是

之类的
for (a;b;c) xxxxxxxxx ;

for (a;b;c;)\n{

}

我目前的做法是跳过所有字符,直到遇到;{,使用查看函数来决定它是哪种类型的循环。

正则表达式

^[ \t]*for[ \t]*(.*\\;.*\\;.*)[ \t\n]*[^{\;]

找到带有大括号的所有循环,但没有它们就找不到单行循环。我认为第一个正则表达式应该比这个更好,但事实并非如此。 (一旦我得到" for"陈述工作,我将继续前进到#34;而#34;循环等等。)

我很感激我能得到的任何帮助。

1 个答案:

答案 0 :(得分:4)

尝试为这种情况找到一个万无一失的正则表达式很困难,但您可以利用cc-mode函数来帮助浏览代码并避免计算注释或宏内的任何内容。

我不完全确定你的“长度”是什么意思,但下面的函数搜索for循环,如果找到一个循环,则返回它确定为{{{}的结尾之间的距离。 1}}循环及其开头。如果找不到for循环,则返回for。如果按“长度”表示其他内容,您应该能够轻松地调整代码以执行您想要的操作。

nil

(defun for-loop-length () (save-excursion (if (c-syntactic-re-search-forward "\\_<for\\_>" (point-max) t) (let ((start (match-beginning 0))) (c-skip-ws-forward) (forward-sexp) (c-skip-ws-forward) (if (char-equal (char-after) ?{) (forward-sexp) (c-end-of-statement)) (- (point) start))))) 函数会自动跳过在注释,字符串文字和宏中搜索。 c-syntactic-re-search-forward函数处理跳过水平和垂直空白的问题。 c-skip-ws-forward函数处理没有大括号的c-end-of-statement循环的情况,即使它在另一行上也能找到结束分号。