【问题标题】:Emacs Regexp Replace Group OnlyEmacs Regexp 仅替换组
【发布时间】:2014-01-29 04:36:43
【问题描述】:

我想用expected_status 替换文件中有几个header 字符串。 header 显示为 headersheader:。我只想用预期状态的冒号替换那些,所以:header: --> expected_status:

我正在使用replace-regexp 和以下命令:

Replace string (default \(header\):?$ -> expected_status):

但是,它没有正确替换。它也将冒号替换为expected_status。有没有办法让 emacs 只对已识别的 regexp 组进行替换?

【问题讨论】:

    标签: regex emacs


    【解决方案1】:

    有没有办法让 emacs 只对已识别的正则表达式组进行替换?

    当然;但不是replace-regexp

    (while (re-search-forward "\\(header\\):" nil t)
      (replace-match "expected_status" nil nil nil 1))
    

    末尾的1replace-matchSUBEXP 参数,指定要从匹配的正则表达式中替换的组/子表达式。

    所以,例如:

    (defun my-replace-regexp-group (from to group)
      "In all matches for regexp FROM, replace the content of GROUP with TO."
      (interactive "sFrom: \nsTo: \nnGroup: ")
      (while (re-search-forward from nil t)
        (replace-match to nil nil nil group)))
    

    【讨论】:

      【解决方案2】:

      不会更容易忘记组并执行 M-x replace-regexp RET header: RET expected_status: RET

      或者也许我错过了你想要实现的目标。

      并以一般的方式回答您的问题:

      要仅替换一个正则表达式组,您需要创建三个组:

      \(the-stuff-before\)\(the-stuff-you-want-to_replace\)\(the-stuff-after\)
      

      然后将其替换为

      \1the-stuff-you-want\3
      

      【讨论】:

      • 是的,但问题是header:?。所以我还是想用它来代替header 不带冒号,而不是headers
      • 如果前后可以是任意的怎么办?这似乎使正则表达式复杂化。难道没有办法只选择一个组并替换它吗?
      • 如果前后是任意的,只需要替换stuffA bu stuffB即可。那是微不足道的。在您的情况下,“之前”不存在,“之后”是正则表达式“:?$”。您可以将 header(:?)$ 替换为 expected_status\1
      【解决方案3】:

      不 - 但你可以做什么标记你想要保留的部分,然后将其包含在替换表达式中。不确定您尝试匹配的确切正则表达式 - 但似乎是带有可选“:”的“标题”并将其替换为“expected_status”。

      要保留可选的“:”,请将“header(:?)$”替换为“\1:expected_status”

      【讨论】:

      • 你的意思是,"(header):?$" 和"\1expected_status"?你为什么要对冒号进行分组?您是否对不想替换的部分进行分组?将您实际要替换的那个分组是有意义的。
      • 分组只允许表达式的该部分在其他地方再次使用。与正则表达式匹配的整个字符串将被替换 - 但如果您标记要保留的部分,您可以将其放回替换部分。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-11
      • 2017-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-12
      相关资源
      最近更新 更多