【问题标题】:Replace double backslash with single backslash in Emacs在 Emacs 中用单反斜杠替换双反斜杠
【发布时间】:2009-08-27 04:59:47
【问题描述】:

我在 Emacs 中使用 re-builder 创建了一个正则表达式。我使用 C-c C-w 将其复制到杀伤环。

杀戮环显示:

"\\(defun\\)"

首先,我修改了复制功能,去掉了“”。

\\(defun\\)

我的另一个问题是,kill-ring 中的正则表达式包含双反斜杠,使其无法用于 query-replace-regexp 之类的函数,我想将其从 kill-ring 中拉回戒指。

这些函数需要单个反斜杠,例如

\(defun\)

所以我想我可以通过这样做将 '\\' 替换为 '\',然后再将其复制到 kill-ring:

(replace-regexp-in-string "\\\\" "\\" "\\(defun\\)" nil t)

当执行函数时,迷你缓冲区显示“\\(defun\\)”而不是“\(defun\)”。

我做错了什么?

【问题讨论】:

    标签: regex emacs


    【解决方案1】:

    这对我有用:

    (defun my-reb-copy ()
      "Copy current RE into the kill ring without quotes and single
    backslashes for later insertion."
      (interactive)
      (reb-update-regexp)
      (let* ((re (with-output-to-string
                   (print (reb-target-binding reb-regexp))))
             (str (substring re 2 (- (length re) 2))))
        (with-temp-buffer
          (insert str)
          (goto-char (point-min))
          (while (search-forward "\\\\" nil t)
            (replace-match "\\" nil t))
          (kill-new (buffer-substring (point-min) (point-max))))
        (message "Regexp copied to kill-ring")))
    
    (define-key reb-mode-map "\C-c\C-t" 'my-reb-copy)
    

    【讨论】:

      【解决方案2】:

      通过'insert'princ 传递您的字符串会为您进行替换。

      (princ "\\(defun\\)")
      ->
      \(defun\)
      

      我没有看到直接执行此操作的明显方法,这是一种非常复杂的方法,似乎适用于我的测试字符串:

      (defun my-insert-kill ()
        "convoluted way to replace \\ in strings"
        (interactive)
        (princ (with-temp-buffer
                 (insert "(progn (princ ")
                 (insert (current-kill 0))
                 (insert ") (insert \"\n\") nil)")
                 (eval-print-last-sexp)
                 (backward-sexp) (backward-char)
                 (let ((p (point)))
                   (goto-char (point-min))
                   (forward-sexp) (forward-char)
                   (buffer-substring (point) p)))
               (current-buffer)))
      

      【讨论】:

      • 是的,在像 scratch 这样的缓冲区中评估我可以用 (while (search-forward "\\\\" nil t) (replace-match " \\" nil t)),虽然您的解决方案当然要容易得多,但我需要以某种方式将其包装在命令中。
      【解决方案3】:

      re-builder+.el 对 re-builder 有一些扩展,提供了将 re-builder 与 query-replace-regexpreplace-regexp. 一起使用的功能

      http://www.emacswiki.org/emacs/re-builder+.el

      【讨论】:

        【解决方案4】:

        这样的?

        (defun my-yank-unstring ()
          (interactive)
          (insert (car (read-from-string (current-kill 0)))))
        

        (感谢 Trey 提供(current-kill 0) 位。)

        【讨论】:

          【解决方案5】:

          退一步,您可以将变量reb-re-syntax 设置为string,而不是默认的read。这会将re-builder 的行为更改为use single backslashes instead of double

          使用自定义来做到这一点:

          M-x customize-variable RET rev-re-syntax RET
          

          或添加到您的 .emacs 文件中:

          (set reb-re-syntax 'string)
          

          然后,直接跳转到替换,你可以使用this defun:

          (defun reb-query-replace (to-string)
            "Replace current RE from point with `query-replace-regexp'."
            (interactive
             (progn (barf-if-buffer-read-only)
                    (list (query-replace-read-to (reb-target-binding reb-regexp)
                                                 "Query replace"  t))))
            (with-current-buffer reb-target-buffer
              (query-replace-regexp (reb-target-binding reb-regexp) to-string)))
          

          【讨论】:

            猜你喜欢
            • 2012-06-16
            • 1970-01-01
            • 1970-01-01
            • 2013-06-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-04-15
            • 1970-01-01
            相关资源
            最近更新 更多