emacs 查询替换正则表达式倒置

标签 emacs elisp

是否存在针对 subexps 的现有包 query-replace-regexp?

例如给定以下内容

var foo1 = blah( properties, property_id);

var foo2 = blah(properties, property_id );

var foo3 = blah(  properties, property_id      );

我想删除大括号周围的填充。

通常,方法是对要保留的位进行分组,然后组装一个替换位。

搜索:

\(var .* = blah\s-*(\)\s-*\(.*?\)\s-*\()\)

替换:

\1\2\3

但是,使用正则表达式对我的位进行分组似乎要容易得多 想要删除而不是相反。就像这个:

var .* = blah\s-*(\(\s-*\).*?\(\s-*\))

我将从中得到两个子组。我如何定位它们进行更换?

编辑:我要求一种交互方式来“反转”给定的正则表达式。所以接口(interface)类似于query-replace-regexp

  1. 输入正则表达式
  2. 为第 1 组输入替换
  3. 为第 2 组输入替换

最佳答案

我认为这应该有一些变化:

(defun remove-padding ()
  (interactive)
  (while (search-forward-regexp
          "var .* = [a-zA-Z_]+\\s-*(\\(\\s-*\\).*?\\(\\s-*\\))"
          nil t)
    ;; Replace the 2 subexpressions with nothing
    (replace-match "" nil t nil 2)
    (replace-match "" nil t nil 1)))

但是,您也可以考虑使用像 indent 这样的工具取决于您的用例。

编辑: 下面是一个非常简单的交互版本。 query-replace-regexp 函数非常复杂,我没有尝试重现它的所有功能。

(require 're-builder)
(defun query-replace-subexpressions (regexp replacements)
  "REPLACEMENTS need to be in reverse order if passed from lisp!"
  ;; Read the correct number of subexpressions
  (interactive
   (let* ((re (read-from-minibuffer "Query replace subexps: "))
          (num-subexps (reb-count-subexps re))
          (replacement-list nil)
          (replacements (dotimes (rep num-subexps)
                          (setq replacement-list
                                (cons
                                 (read-from-minibuffer
                                  (format "Replace subexpression %s with: " rep))
                                 replacement-list)))))
     (list re replacement-list)))
  ;; Search
  (let ((len (length replacements)))
    (while (search-forward-regexp regexp nil t)
      (replace-highlight (match-beginning 0) (match-end 0)
                         (point-min) (point-max) regexp
                         t case-fold-search)
      ;; Query
      (when (save-match-data (y-or-n-p "Replace this occurrence? "))
        ;; Make all the replacements
        (dotimes (i len)
          (replace-match (nth i replacements) nil nil nil (- len i)))))
    (replace-dehighlight)))


;; Test it out below
(query-replace-subexpressions
 "var .* = [a-zA-Z_]+\\s-*(\\(\\s-*\\).*?\\(\\s-*\\))"
 '("" ""))

var foo1 = blah(properties, property_id    );

var foo2 = blah (properties, property_id );

var foo3 = blah( properties, property_id      );

关于emacs 查询替换正则表达式倒置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11280195/

相关文章:

emacs - 我应该使用什么作为 emacs 前奏的配置/设置文件?

c - 是否可以使用 C 为 GNU Emacs 编写自定义原语?

search - 如何将 current-prefix-arg 传递给此命令

emacs - 使用邪恶键绑定(bind)时在 emacs 中按 Ctrl+U

emacs - 在emacs中的点替换文件

emacs - 我无法初始化 swank 和 clojure-jack-in

windows - 如何让AppVeyor使用不同版本的Emacs?

emacs - 为两种情况配置 Yasnippet - (1) 区域处于事件状态; (2) 区域不活跃

emacs - 如何在正则表达式、Emacs/elisp 风格中用 "("替换 "\("?

emacs - 如何将 elisp 列表放入 elisp 哈希