正则表达式替换中的Emacs正则表达式组

Kiz*_*aru 6 regex emacs elisp

我在文件中有一堆C宏,其中的东西NEXT( pL )扩展到了( ( pL ) -> next )

我想删除大部分内容,因为它们是不必要的.

我想做的是将文本放在宏中的括号内pL.我希望替换正则表达式使用该文本进行重写.例如,在Perl中我可以做类似的事情/NEXT\(\s*(.+)\s*)(可能有点不正确),然后输出类似的东西$1->next,这应该变成一条线

if ( NEXT( pL ) != NULL ) { 
Run Code Online (Sandbox Code Playgroud)

if ( pL->next != NULL ) {
Run Code Online (Sandbox Code Playgroud)

在Emacs中,我想在逐个文件的基础上在emacs replace-regexp中使用匹配组.我不完全确定如何在Emacs中执行此操作.

Tre*_*son 13

M-x query-replace-regexp NEXT(\([^)]+\)) RET \1->next RET
Run Code Online (Sandbox Code Playgroud)

这可以在像这样的函数内部完成(以应用于整个缓冲区)

(defun expand-next ()
  "interactive"
  (goto-char (point-min))
  (while (re-search-forward "\\<NEXT(\\([^\)]+\\))" nil t)
    (replace-match "\\1->next")))
Run Code Online (Sandbox Code Playgroud)

并且,要将其应用于多个文件,您可以在Dired中Qquery-replace-regexp标记文件并键入对所有标记的文件执行操作(在此答案的第一行中使用regexp/replacement).