gpt4 book ai didi

regex - 我需要一个 Emacs 正则表达式来查找 "for"循环

转载 作者:太空宇宙 更新时间:2023-11-03 18:51:34 25 4
gpt4 key购买 nike

我正在尝试编写一个 Emacs lisp 函数来查找 C 文件中的所有“for”循环并计算它们的长度。我还没有找到一个正则表达式。将找到所有“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”语句起作用,我将继续使用“while”循环等)

如果能得到任何帮助,我将不胜感激。

最佳答案

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

我不太确定你所说的“长度”是什么意思,但下面的函数搜索一个 for 循环,如果找到一个,返回它确定的结束点之间的距离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 函数处理不带大括号的 for 循环的情况,找到结束分号,即使它在另一行也是如此。

关于regex - 我需要一个 Emacs 正则表达式来查找 "for"循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47130741/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com