【问题标题】:Converting "$$...$$" into "\[...\]" in emacs with replace-regexp使用 replace-regexp 在 emacs 中将 "$$...$$" 转换为 "\[...\]"
【发布时间】:2015-08-26 18:35:55
【问题描述】:

我正在尝试使用 emacs 将“$$...$$”形式的字符串转换为“\[...\]”。我刚刚开始学习使用 emacs 来编辑一些文件。

按照emacs wiki上replace-regexp的first example,我最初尝试过:

 M-x replace-regexp
 Replace regexp: \$\$.*\$\$
 Replace regexp with: \,("\[" \1 "\]")

但我收到了错误:invalid function "["。我反而尝试了

Replace regexp with: "\["\1"\]"

但我收到了错误:Invalid use of `\' in replacement text

由于这两种方法都不起作用,因此我尝试在 emacs wiki 上调整替换正则表达式的 13th example,写作

M-x replace-regexp
Replace regexp: \$\$
Replace regexp with: \,(if (evenp \#) "\[" "\]")

但我收到错误:(void-function evenp)。有什么建议么?我想了解每种情况下出了什么问题,以及如何解决这些问题。

【问题讨论】:

  • evenpcl 库的一部分。要么(require 'cl),要么使用cl-evenp(require 'cl-lib)。现在推荐使用后者(非前缀名称现在是别名),但是 YMMV。

标签: regex emacs


【解决方案1】:

您不需要宏。

(replace-regexp "\\$\\$\\(.*?\\)\\$\\$"
                "\\\\[\\1\\\\]")

或者

Replace regexp: \$\$\(.*?\)\$\$
Replace with: \\[\1\\]

更新

  1. 使用贪婪语法.*? 处理一行中出现多次的情况(来自@phil 下面的评论)。

  2. 请注意,当$$ 之间的文本跨多行时,这不起作用。如果文本分布在多行中,则以下内容应该可以工作,尽管那时我可能更喜欢滚动我自己的函数:

    (replace-regexp "\\$\\$\\(\\(.\\|\n\\)*?\\)\\$\\$"
                    "\\\\[\\1\\\\]")
    

    或者

    替换正则表达式:\$\$\(\(.\| C-qC-j \)*?\)\$\$
    替换为:\\[\1\\]

【讨论】:

  • 我看到很多双反斜杠。那么当引号中的内容时,我需要添加另一个反斜杠吗?
  • Yes :) \ 也是带引号的字符串中的特殊字符,例如\t 是制表符。要在带引号的字符串中使用实际的反斜杠字符,您需要使用“\\”。所以“\\$”实际上只有两个字符,\和$。它们一起表示文字 $,因为 $ 是正则表达式的特殊字符。
  • 好的。另外,为了澄清,为了实现我想要的,我认为你写的Replace with 行应该说:Replace with: \\[\1\\]。否则,效果很好!
  • 这是错误的,因为.* 是贪婪的(问题中的版本有同样的问题)。它必须是非贪婪的.*?
  • @phils 你是对的。当我尝试使用多行版本时,我遇到了堆栈溢出。正确的多行版本是:Replace regexp: \$\$\(.\|\n\)*?\$\$。但是,当我写 Replace regexp with: \\[\1\\] 时,它只是用新行替换了多行表达式的内部,擦除了所有其他文本......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多