【问题标题】:Regex replacement with Emacs用 Emacs 替换正则表达式
【发布时间】:2009-06-29 21:40:13
【问题描述】:

我正在尝试做一个search and replace with regexs

假设我有一个foreach(foo1.txt, foo2.txt, foo3.txt, foo4.txt)。 我想在列表中的每个项目周围加上 "。

我认为 - 从文档中 - 这个正则表达式可以工作 (foo[1-4]\.txt) -> "\&".

但事实并非如此。我做错了什么?

【问题讨论】:

    标签: regex emacs


    【解决方案1】:

    请注意,search 正则表达式中的括号和圆括号需要转义(“额外的斜线”),而 replace 正则表达式中则不需要。

    转义是必需的,因为 lisp 解析器在正则表达式引擎之前看到正则表达式。

    但是,如果您以编程方式编写(而不是交互式输入),则需要转义转义符!哎呀呀呀....

    interactive:
    M-x replace-regexp RET \(obj.method(.*)\{1\}\) RET trim$(\1)
    
    programmatic:
    (replace-regexp "\\(obj.method(.*)\\{1\\}\\)" "trim$(\\1)")
    

    转义的括号被转义,因为它们正在分组,未转义的括号是文字括号。

    您可能想查看Emacs Wiki Regex Crash CourseSteve Yegge's Effective Emacs regex section

    【讨论】:

    • 有帮助,但有点吓人。 “逃脱逃脱”。米普。
    【解决方案2】:

    试试这样的\(foo[1-4]\.txt\)

    【讨论】:

      【解决方案3】:

      Emacs 正则表达式总是让我感到困惑,因为它们不是 Perl:

      \(foo[1-4]\.txt\)
      

      您需要在 Emacs 中使用反斜杠。

      【讨论】:

        【解决方案4】:

        您已经得到了关于正则表达式的正确答案,但在这种情况下,使用宏可能会更容易。将点放在名字的开头,然后键入:

        C-x ( " M-f M-f " C-f C-f C-x )
        

        即开始录制宏,插入引号,前移两个单词,插入引号,前移两个字符用于下一个元素,停止录制宏。

        然后使用C-x e 运行宏。要重复,只需再次点击e

        (在 Emacs 23 中,您可以使用 F3 代替“C-x (”,使用 F4 代替“C-x )”和“C-x e”。)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-24
          相关资源
          最近更新 更多