【问题标题】:Emacs regexp groups in regex-replaceregex-replace 中的 Emacs 正则表达式组
【发布时间】:2011-05-18 18:35:26
【问题描述】:

我在文件中有一堆 C 宏,例如 NEXT( pL ) 扩展为 ( ( pL ) -> next )

我想删除其中的大部分,因为它们是不必要的。

我想做的是获取宏中括号内的文本pL。我希望替换正则表达式使用该文本进行重写。例如,在 Perl 中,我可以执行/NEXT\(\s*(.+)\s*) 之类的操作(可能有点不正确),然后输出$1->next 之类的内容,这应该会变成一行

if ( NEXT( pL ) != NULL ) { 

进入

if ( pL->next != NULL ) {

在 Emacs 中,我想逐个文件地在 emacs 替换正则表达式中使用匹配组。我不完全确定如何在 Emacs 中执行此操作。

【问题讨论】:

  • M-x c-macro-expansionM-x c-macro-expand 可以使用。但是你所要求的看起来需要一个围绕M-x c-macro-expansion 的新函数来处理整个文件或缓冲区。
  • c-macro-expand 不知道宏吗?它们位于单独的文件/缓冲区中。

标签: regex emacs elisp


【解决方案1】:
M-x query-replace-regexp NEXT(\([^)]+\)) RET \1->next RET

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

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

并且,要将其应用于多个文件,您可以在 Dired and type Q to do a query-replace-regexp on all the marked files 中标记文件(使用此答案第一行中的正则表达式/替换)。

【讨论】:

  • 感谢您的回答。我也从 emacs IRC 频道得到了非常有用的答案。
  • 我在这里挖掘一些旧垃圾而不是提交一个新问题,因为这是正确的主题......我使用的是 Emacs 23.1。当我使用 \1 作为替换时,我得到“找不到匹配项”。我使用从 regexp-builder 构建的相同正则表达式,它与找到的文本正确匹配。有什么想法吗??
猜你喜欢
  • 2012-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多