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

标签 regex emacs

我正在尝试编写一个 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/

相关文章:

bash - 如何指定用户的 emacs init 文件以使用 emacsclient 加载?

emacs - 为什么当我尝试打印无效符号时 GDB 这么慢?

emacs - 使用 Sweave 文档修改 Emacs 选项卡行为

emacs - 我怎样才能简单地通过所有可用的文档文本进行 grep 搜索?

r - 在 R 中使用正则表达式提取子字符串

java - 为什么我的单词是一个空字符串,当我用\\s 拆分()我的字符串时

javascript - 正则表达式组与空格匹配

python - 匹配从开头到多字符子字符串第一次出现的一段文本

php - 将函数从 Javascript 转换为 PHP

emacs - Emacs : your terminal doesn't support cursor position requests (CPR) 中的 iPython 警告